我使用Paramiko向远程Linux服务器运行一些ssh命令。这些命令将在控制台中连续输出,我想在本地控制台窗口中打印这些信息。
stdin, stdout, stderr = ssh.client.exec_command("ls")
for line in stdout.read()
print line,
ssh.client.close()
因此,如果我编写这样的代码,所有输出信息将被发送给我,直到命令完成执行,而我想要实时打印输出。
非常感谢。
答案 0 :(得分:6)
当然有办法做到这一点。 Paramiko execute_command
是异步的,无论您的主线程如何,数据到达时都会填充bufferes。
在您的示例中,stdout.read(size=None)
将尝试一次读取完整的缓冲区大小。由于新数据总是到达,因此不会退出。为避免这种情况,您可以尝试以较小的块来读取stdout
。这是一个按字节顺序读取缓冲区并在收到\n
后生成行的示例。
sin,sout,serr = ssh.exec_command("while true; do uptime; done")
def line_buffered(f):
line_buf = ""
while not f.channel.exit_status_ready():
line_buf += f.read(1)
if line_buf.endswith('\n'):
yield line_buf
line_buf = ''
for l in line_buffered(sout):
print l
您可以通过调整代码以使用select.select()
并使用更大的块大小来提高性能,请参阅this answer,其中还考虑了可能导致空响应的常见挂起和远程命令出口检测方案