我试图建立一个实时的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
感谢。
答案 0 :(得分:1)
我无法使用您的命令重现问题,但我可以使用cat some_big_file.txt
之类的命令重现它。
所以看起来你的假设是正确的。在您阅读channel
中的所有内容之前,可以准备退出状态。目前尚不清楚您是否真的需要使用select
。如果不是,我会重写循环:
while True:
buf = channel.recv(1024)
if not buf:
break
print buf
此循环将继续读取通道,同时其中包含一些数据。如果你真的想使用select
,你可以在你的循环之后放置上面的循环。它将读取并打印剩余数据。