Paramiko连续stdout

Alf*_*red 5 python ssh paramiko

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

stdin, stdout, stderr = ssh.client.exec_command("ls")
for line in stdout.read()
    print line,
ssh.client.close()
Run Code Online (Sandbox Code Playgroud)

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

非常感谢.

tin*_*tin 8

当然有办法做到这一点.的paramiko execute_command是异步,而不管数据到达你的主线程的bufferes被填充.

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

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
Run Code Online (Sandbox Code Playgroud)

您可以通过调整要使用的代码并使用select.select()更大的块大小来提高性能,请参阅此答案,该答案还会考虑可能导致空响应的常见挂起和远程命令出口检测方案.