1.简单版
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
# coding: utf-8 import paramiko import re from time import sleep def ssh(): ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) #指定当对方主机没有本机公钥的情况时应该怎么办,AutoAddPolicy表示自动在对方主机保存下本机的秘钥 ssh.connect( '172.16.1.5' , 22 , 'linyouyi' , '123456' ) #SSH端口默认22,可改 stdin,stdout,stderr = ssh.exec_command( "df -hl" ) #这三个得到的都是类文件对象 outmsg,errmsg = stdout.read(),stderr.read() #读一次之后,stdout和stderr里就没有内容了,所以一定要用变量把它们带的信息给保存下来,否则read一次之后就没有了 #outmsg = str(outmsg) #print(outmsg.replace("\\n","\\r\\n")) print (outmsg.decode()) print (errmsg) if errmsg = = "": print (outmsg) ssh.close() if __name__ = = '__main__' : ssh() |
2.封装版
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
|
# coding: utf-8 import paramiko import re from time import sleep # 定义一个类,表示一台远端linux主机 class Linux( object ): # 通过IP, 用户名,密码,超时时间初始化一个远程Linux主机 def __init__( self , ip, username, password, timeout = 30 ): self .ip = ip self .username = username self .password = password self .timeout = timeout # transport和chanel self .t = '' self .chan = '' # 链接失败的重试次数 self .try_times = 3 # 调用该方法连接远程主机 def connect( self ): while True : # 连接过程中可能会抛出异常,比如网络不通、链接超时 try : self .t = paramiko.Transport(sock = ( self .ip, 22 )) self .t.connect(username = self .username, password = self .password) self .chan = self .t.open_session() self .chan.settimeout( self .timeout) self .chan.get_pty() self .chan.invoke_shell() # 如果没有抛出异常说明连接成功,直接返回 print (u '连接%s成功' % self .ip) # 接收到的网络数据解码为str print ( self .chan.recv( 65535 ).decode( 'utf-8' )) return # 这里不对可能的异常如socket.error, socket.timeout细化,直接一网打尽 except Exception as e1: if self .try_times ! = 0 : print (u '连接%s失败,进行重试' % self .ip) self .try_times - = 1 else : print (u '重试3次失败,结束程序' ) exit( 1 ) # 断开连接 def close( self ): self .chan.close() self .t.close() # 发送要执行的命令 def send( self , cmd): cmd + = '\r' # 通过命令执行提示符来判断命令是否执行完成 p = re. compile (r ']$' ) result = '' # 发送要执行的命令 self .chan.send(cmd) # 回显很长的命令可能执行较久,通过循环分批次取回回显 sleep( 2 ) ret = self .chan.recv( 65535 ) ret = ret.decode( 'utf-8' ) result + = ret if p.search(ret): print (result) return (result) if __name__ = = '__main__' : host = Linux( '172.16.1.5' , 'linyouyi' , '123456' ) host.connect() host.send( 'll' ) host.close() |
到此这篇关于python 远程执行命令的文章就介绍到这了,更多相关python 远程执行命令内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
原文链接:https://www.cnblogs.com/linyouyi/p/11474518.html