【问题标题】:Paramiko with continuous stdout具有连续标准输出的 Paramiko
【发布时间】:2014-10-05 06:34:17
【问题描述】:

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

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

所以如果我这样写代码,所有的输出信息都会发回给我,直到命令完成执行,而我想实时打印输出。

非常感谢。

【问题讨论】:

    标签: python ssh paramiko


    【解决方案1】:

    当然有办法做到这一点。 Paramiko execute_command 是异步的,无论您的主线程如何,数据到达时都会填充缓冲区。

    在您的示例中,stdout.read(size=None) 将尝试一次读取完整的缓冲区大小。由于新数据总是到达,它永远不会退出。为避免这种情况,您可以尝试以较小的块读取stdout。这是一个按字节读取缓冲区并在收到\n 后产生行的示例。

    stdin,stdout,stderr = 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(stdout):
        print l
    

    您可以通过调整代码以使用 select.select() 和使用更大的块大小来提高性能,请参阅 this answer,其中还考虑了可能导致空响应的常见挂起和远程命令退出检测场景。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-11
    • 2019-09-03
    • 2015-10-28
    • 2015-09-27
    • 1970-01-01
    • 2016-08-03
    • 2018-03-08
    • 2018-03-18
    相关资源
    最近更新 更多