使用paramiko执行命令
我正在写一个Python脚本,这个脚本可以在远程的Linux系统上执行命令。我查找了一下,发现了Paramiko这个库。我开发的脚本在执行像who、ps、ls这样的命令时运行得很好。但是,当我尝试执行top和ping命令时,脚本就失败了。请帮我解决这个问题。
import paramiko
import sys
class sampleParamiko:
ssh = ""
def __init__(self, host_ip, uname, passwd):
try:
self.ssh = paramiko.SSHClient()
self.ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
self.ssh.connect(host_ip, username=uname, password=passwd)
#print "In init function"
except (paramiko.BadHostKeyException, paramiko.AuthenticationException, paramiko.SSHException) as e:
print str(e)
sys.exit(-1)
def ececuteCmd(self,cmd):
try:
stdin, stdout, stderr = self.ssh.exec_command(cmd)
out_put = stdout.readlines()
for item in out_put:
print item,
except paramiko.SSHException as e:
print str(e)
sys.exit(-1)
host_ip = "10.27.207.62"
uname = "root"
password = "linux"
cmd = str(raw_input("Enter the command to execute in the host machine: "))
conn_obj = sampleParamiko(host_ip, uname, password)
conn_obj.ececuteCmd(cmd)
1 个回答
2
你可能想看看 paramiko.SSHClient
里的 invoke_shell()
方法。
根据你的代码,你可以这样做:
import paramiko
import sys
class sampleParamiko:
ssh = ""
def __init__(self, host_ip, uname, passwd):
try:
self.ssh = paramiko.SSHClient()
self.ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
self.ssh.connect(host_ip, username=uname, password=passwd)
#print "In init function"
except (paramiko.BadHostKeyException, paramiko.AuthenticationException, paramiko.SSHException) as e:
print str(e)
sys.exit(-1)
def ececuteCmd(self,cmd):
try:
channel = self.ssh.invoke_shell()
timeout = 60 # timeout is in seconds
channel.settimeout(timeout)
newline = '\r'
line_buffer = ''
channel_buffer = ''
channel.send(cmd + ' ; exit ' + newline)
while True:
channel_buffer = channel.recv(1).decode('UTF-8')
if len(channel_buffer) == 0:
break
channel_buffer = channel_buffer.replace('\r', '')
if channel_buffer != '\n':
line_buffer += channel_buffer
else:
print line_buffer
line_buffer = ''
except paramiko.SSHException as e:
print str(e)
sys.exit(-1)
host_ip = "10.27.207.62"
uname = "root"
password = "linux"
cmd = str(raw_input("Enter the command to execute in the host machine: "))
conn_obj = sampleParamiko(host_ip, uname, password)
conn_obj.ececuteCmd(cmd)
输出结果是:
Jean@MyDesktop:~$ ./test_paramiko.py
Enter the command to execute in the host machine: ping -c2 127.0.0.1
ping -c2 127.0.0.1 ; exit
[root@myserver ~]# ping -c2 127.0.0.1 ; exit
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.032 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.043 ms
--- 127.0.0.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 999ms
rtt min/avg/max/mdev = 0.032/0.037/0.043/0.008 ms
logout
但是你不能以交互的方式发送命令。所以如果你只是输入 ping 127.0.0.1
,它会一直运行下去,直到你按下 [CTRL]+[C] 或者结束你的 Python 脚本。top
命令也是一样。
如果你想要一个交互式的命令行,可以看看 paramiko 自带的示例脚本。特别是 demos/demo.py 和 demos/interactive.py。