Python 带连续stdout的Paramiko
我使用Paramiko向远程Linux服务器运行一些ssh命令。命令将在控制台中连续输出,我想在本地控制台窗口中打印所有这些信息Python 带连续stdout的Paramiko,python,ssh,paramiko,Python,Ssh,Paramiko,我使用Paramiko向远程Linux服务器运行一些ssh命令。命令将在控制台中连续输出,我想在本地控制台窗口中打印所有这些信息 stdin, stdout, stderr = ssh.client.exec_command("ls") for line in stdout.read() print line, ssh.client.close() 因此,如果我像这样编写代码,所有的输出信息将被发送回我,直到命令执行完毕,而我想在live中打印输出 非常感谢。当然有办法做到这一点。Pa
stdin, stdout, stderr = ssh.client.exec_command("ls")
for line in stdout.read()
print line,
ssh.client.close()
因此,如果我像这样编写代码,所有的输出信息将被发送回我,直到命令执行完毕,而我想在live中打印输出
非常感谢。当然有办法做到这一点。Paramiko
execute_命令
是异步的,当数据到达时,无论主线程是什么,都会填充缓冲区
在您的示例中,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()
,并通过使用更大的块大小来提高性能,请参阅,这还考虑了可能导致空响应的常见挂起和远程命令退出检测场景。在您的示例中,f是什么?这让我很困惑:exec\u命令(“while true;do uptime;done”)
这不是一个真正的命令,是吗?f
是通道输出的伪文件对象,在这个特定示例中,stdout(sout
)exec_命令(“while true;do uptime;done”)
远程调用bash-c“while true;do uptime;done”
(取决于sshd和confg.shell)。请概述为什么它不是一个“真正的”命令,否则请随意使用任何其他命令,因为这只是一个例子。我有一个问题,我正试图解决,但我看不出从你的回答这将如何帮助我。您能给出建议吗?如果表示“sout”的f
被传递给函数,为什么函数包含对sout的显式引用<代码>行\u buf+=sout.read(1)?应该是行吗?\u buf+=f.read(1)
?很好。修复了代码,即使它没有任何区别,因为sout==f。