【问题标题】:channel.recv() behaving differently in my python script and python interactive shellchannel.recv() 在我的 python 脚本和 python 交互式 shell 中表现不同
【发布时间】:2017-11-21 06:11:16
【问题描述】:

我的python脚本:

#!/usr/bin/env python
import paramiko as ssh
import logging
client = ssh.SSHClient()
client.load_system_host_keys()
client.set_missing_host_key_policy(ssh.AutoAddPolicy())
client.connect(TCP_IP, username="root", password=" ")
chan = client.get_transport().open_session()
chan.get_pty()
cmd = "mycommand"
chan.exec_command(cmd)
stdout = chan.recv(BUFFER_SIZE)
print stdout, len(stdout)

所以现在当我运行该脚本时,我得到了不同的输出。 原始输出长度为 2058 个字符。

但是当我像 ./aqu.py 这样运行脚本时,我只得到了 63 个字符的输出,而当我需要添加大量的 recv 来获取整个数据时。

当我在 python 解释器中运行这些指令时(输入 python 命令,然后一一输入命令)。我在单个recv 中获得完整的输出。

可能出了什么问题?

【问题讨论】:

    标签: python linux shell paramiko channel


    【解决方案1】:

    如果您的数据没有完全缓冲,您可能会有这种行为。您可以使用chan.recv_ready() 进行测试。 recv_ready() 方法的文档是 here

    编辑: 你可以这样做:

    done = False
    while not done:
        result = chan.recv(MAX_BUFF_SIZE)
        # DO something with the result
        done = len(result) == 0
    

    【讨论】:

    • 即使缓冲区中有一些数据,它也会返回true?但这不是我需要的行为。当整个输出被缓冲时我需要。
    • 是的,你是对的。在这种情况下,我建议您在 while 循环中调用 recv,直到它返回收到的 0 个字节,这应该可以解决您的问题。
    • 嗯,它不会返回 0。它会等到它获取数据,因为我没有关闭通道流。我只是打开它。
    • 在致电recv() 之前,您是否尝试过recv_exit_status()
    • 不,我没有。基本上,我正在执行的 cmd 永远不会自行退出。它在while循环中,它是一种服务器。我将在 python 中创建一个套接字并与服务器通信。 cmd 执行后会输出一个数字,我需要读取那个数字并创建一个带有该数字的套接字
    猜你喜欢
    • 2016-05-29
    • 2011-08-31
    • 2017-02-13
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 2013-06-19
    • 1970-01-01
    • 2023-03-09
    相关资源
    最近更新 更多