python – Paramiko:如何确保命令之间接收数据

前端之家收集整理的这篇文章主要介绍了python – Paramiko:如何确保命令之间接收数据前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用Paramiko发布一些命令并收集结果以供进一步分析.每隔一段时间,第一个命令的结果会在时间上完全返回,最后会在第二个命令的输出中结束.

我正在尝试使用recv_ready来解释这个问题,但它没有用,所以我认为我做错了什么.这是相关的代码

  1. pause = 1
  2.  
  3. def issue_command(chan,pause,cmd):
  4. # send commands and return results
  5. chan.send(cmd + '\n')
  6. while not chan.recv_ready():
  7. time.sleep(pause)
  8. data = chan.recv(99999)
  9.  
  10. ssh = paramiko.SSHClient()
  11. ssh.load_system_host_keys()
  12. ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
  13. chan = ssh.connect(host,port=22,username=username,password=password,timeout=3,)
  14.  
  15. resp1 = issue_command(chan,cmd1)
  16. resp2 = issue_command(chan,cmd2)

这些命令的输出相对较小(几句话).增加暂停可能会解决问题,但不是理想的解决方案.

任何建议或建议将不胜感激.

解决方法

我会直接使用传输并为每个命令创建一个新通道.然后你可以使用类似的东西:
  1. def issue_command(transport,command):
  2. chan = transport.open_session()
  3. chan.exec_command(command)
  4.  
  5. buff_size = 1024
  6. stdout = ""
  7. stderr = ""
  8.  
  9. while not chan.exit_status_ready():
  10. time.sleep(pause)
  11. if chan.recv_ready():
  12. stdout += chan.recv(buff_size)
  13.  
  14. if chan.recv_stderr_ready():
  15. stderr += chan.recv_stderr(buff_size)
  16.  
  17. exit_status = chan.recv_exit_status()
  18. # Need to gobble up any remaining output after program terminates...
  19. while chan.recv_ready():
  20. stdout += chan.recv(buff_size)
  21.  
  22. while chan.recv_stderr_ready():
  23. stderr += chan.recv_stderr(buff_size)
  24.  
  25. return exit_status,stdout,stderr
  26.  
  27. ssh = paramiko.SSHClient()
  28. ssh.load_system_host_keys()
  29. ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
  30. ssh.connect(host,)
  31. transport = ssh.get_transport()
  32. pause = 1
  33.  
  34. resp1 = issue_command(transport,cmd1)
  35. resp2 = issue_command(transport,cmd2)

更好的方法获取一个命令列表并为每个命令生成一个新通道,轮询每个chan的recv_ready,并在输出可用时吸收它们的stdout / stderr.

猜你在找的Python相关文章