Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 带连续stdout的Paramiko_Python_Ssh_Paramiko - Fatal编程技术网

Python 带连续stdout的Paramiko

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

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

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。