python – Paramiko:如何确保命令之间接收数据
发布时间:2020-05-23 10:37:49 所属栏目:Python 来源:互联网
导读:我正在使用Paramiko发布一些命令并收集结果以供进一步分析.每隔一段时间,第一个命令的结果会在时间上完全返回,最后会在第二个命令的输出中结束. 我正在尝试使用recv_ready来解释这个问题,但它没有用,所以我认为我做错了什么.这是相关的代码: pause = 1def is
|
我正在使用Paramiko发布一些命令并收集结果以供进一步分析.每隔一段时间,第一个命令的结果会在时间上完全返回,最后会在第二个命令的输出中结束. 我正在尝试使用recv_ready来解释这个问题,但它没有用,所以我认为我做错了什么.这是相关的代码: pause = 1
def issue_command(chan,pause,cmd):
# send commands and return results
chan.send(cmd + 'n')
while not chan.recv_ready():
time.sleep(pause)
data = chan.recv(99999)
ssh = paramiko.SSHClient()
ssh.load_system_host_keys()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
chan = ssh.connect(host,port=22,username=username,password=password,timeout=3,)
resp1 = issue_command(chan,cmd1)
resp2 = issue_command(chan,cmd2)
这些命令的输出相对较小(几句话).增加暂停可能会解决问题,但不是理想的解决方案. 任何建议或建议将不胜感激. 解决方法我会直接使用传输并为每个命令创建一个新通道.然后你可以使用类似的东西:def issue_command(transport,command):
chan = transport.open_session()
chan.exec_command(command)
buff_size = 1024
stdout = ""
stderr = ""
while not chan.exit_status_ready():
time.sleep(pause)
if chan.recv_ready():
stdout += chan.recv(buff_size)
if chan.recv_stderr_ready():
stderr += chan.recv_stderr(buff_size)
exit_status = chan.recv_exit_status()
# Need to gobble up any remaining output after program terminates...
while chan.recv_ready():
stdout += chan.recv(buff_size)
while chan.recv_stderr_ready():
stderr += chan.recv_stderr(buff_size)
return exit_status,stdout,stderr
ssh = paramiko.SSHClient()
ssh.load_system_host_keys()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(host,)
transport = ssh.get_transport()
pause = 1
resp1 = issue_command(transport,cmd1)
resp2 = issue_command(transport,cmd2)
更好的方法是获取一个命令列表并为每个命令生成一个新通道,轮询每个chan的recv_ready,并在输出可用时吸收它们的stdout / stderr. (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
