Paramiko连续stdout

时间:2014-08-12 08:56:21

标签: python ssh paramiko

我使用Paramiko向远程Linux服务器运行一些ssh命令。这些命令将在控制台中连续输出,我想在本地控制台窗口中打印这些信息。

stdin, stdout, stderr = ssh.client.exec_command("ls")
for line in stdout.read()
    print line,
ssh.client.close()

因此,如果我编写这样的代码,所有输出信息将被发送给我,直到命令完成执行,而我想要实时打印输出。

非常感谢。

1 个答案:

答案 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,其中还考虑了可能导致空响应的常见挂起和远程命令出口检测方案