【问题标题】:Python Paramiko Client SSH very slow when read stdout读取标准输出时,Python Paramiko Client SSH 非常慢
【发布时间】:2021-06-17 12:53:19
【问题描述】:

我正在使用 Paramiko 通过 SSH 控制 VM。当我发送任何命令时,它几乎立即执行,但从 stdout 读取输出时,它需要很长时间。

我有大约 5 秒的时间阅读 ls:

命令执行时间:0.1445319652557373

读取输出的时间:5.382704973220825

这是一个片段:

import time
import paramiko

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname="192.168.0.123",
        port=1234,
        username="admin",
        password="admin")

t1 = time.time()
stdin, stdout, stderr = ssh.exec_command("powershell -command \"ls -recurse .\"")
t2 = time.time()

t3 = time.time()
print(stdout.readlines())
t4 = time.time()

print(t2 - t1)
print(t4 - t3)

谢谢!

【问题讨论】:

  • exec_command 没有完全执行命令。它只是开始执行。实际上是 readlines 等待命令完成。见Paramiko with continuous stdout。或者您是否有任何证据表明 Paramiko 实际上读取输出的速度比其他 SSH 客户端慢?执行ssh admin@192.168.0.123 powershell -command "ls -recurse ."需要多长时间?

标签: python performance ssh output paramiko


【解决方案1】:

stdout.readlines() 在您的子进程完成之前读取所有行并将 EOF 发送到您的主进程。如果您想在可用时逐行读取,请执行for line in exp.stdout,文件对象允许您遍历每一行作为其通过管道的馈送。否则最好使用stdout, stderr = Subprocess.communicate(None),因为通信方法使用更好的系统调用从子进程中读取数据(如 epoll、select、poll)。

【讨论】:

猜你喜欢
  • 2018-03-18
  • 1970-01-01
  • 1970-01-01
  • 2019-11-19
  • 2014-10-25
  • 1970-01-01
  • 1970-01-01
  • 2013-06-12
  • 1970-01-01
相关资源
最近更新 更多