Paramiko在读取所有输出之前完成过程

时间:2016-05-04 15:33:50

标签: python ssh paramiko

我试图建立一个实时的SSH库,但由于经常陷入困境,我从Long-running ssh commands in python paramiko module (and how to end them)获取了这些代码。 但是这段代码并没有打印出整个输出。

我想当while循环退出channel.exit_status_ready()时,通道仍然有数据要读取。我一直试图解决这个问题,但修复不是在所有输入上。

如何使这项工作打印所有类型的命令?

import paramiko
import select

client = paramiko.SSHClient()
client.load_system_host_keys()
client.connect('host.example.com')
channel = client.get_transport().open_session()
channel.exec_command("cd / && ./test.sh")
while True:
    if channel.exit_status_ready():
        break
    rl, wl, xl = select.select([channel], [], [], 0.0)
    if len(rl) > 0:
        print channel.recv(1024)

test.sh:

echo 1
wait 1
echo 2
wait 1
echo 3

输出:

1

2

Process finished with exit code 0

感谢。

1 个答案:

答案 0 :(得分:1)

我无法使用您的命令重现问题,但我可以使用cat some_big_file.txt之类的命令重现它。

所以看起来你的假设是正确的。在您阅读channel中的所有内容之前,可以准备退出状态。目前尚不清楚您是否真的需要使用select。如果不是,我会重写循环:

while True:
    buf = channel.recv(1024)
    if not buf:
        break
    print buf

此循环将继续读取通道,同时其中包含一些数据。如果你真的想使用select,你可以在你的循环之后放置上面的循环。它将读取并打印剩余数据。