【问题标题】:Paramiko finish process before reading all outputParamiko 在读取所有输出之前完成进程
【发布时间】:2016-05-05 00:07:43
【问题描述】:

我正在尝试创建一个实时 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

谢谢。

【问题讨论】:

    标签: python ssh paramiko


    【解决方案1】:

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

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

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

    这样的循环会在通道中有一些数据时继续读取它。如果你真的想使用select,你可以把上面的循环放在你的循环之后。它将读取并打印剩余数据。

    【讨论】:

    • 我有一些类似的问题,您的代码有所帮助,但如果尝试发送多个命令,循环不会中断。看起来if not buf: break 部分不起作用。我在互联网上找不到任何关于如何比较缓冲区中的字节的信息。有什么想法吗?
    猜你喜欢
    • 2023-04-10
    • 2015-02-10
    • 2022-01-15
    • 1970-01-01
    • 2016-04-13
    • 2021-12-28
    • 2013-08-18
    • 2018-03-25
    • 1970-01-01
    相关资源
    最近更新 更多