我正在使用 Paramiko 发出许多命令并收集结果以供进一步分析。每隔一段时间,第一个命令的结果就会及时完全返回,并最终出现在第二个命令的输出中。

我正在尝试使用 recv_ready 来解决这个问题,但它不起作用,所以我认为我做错了什么。这是相关的代码:

pause = 1

def issue_command(chan, pause, cmd):
    # send commands and return results
    chan.send(cmd + '\n')
    while not chan.recv_ready():
        time.sleep(pause)
    data = chan.recv(99999)

ssh = paramiko.SSHClient()
ssh.load_system_host_keys()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
chan = ssh.connect(host, port=22, username=username, password=password, timeout=3,)

resp1 = issue_command(chan, pause, cmd1)
resp2 = issue_command(chan, pause, cmd2)

这些命令的输出相对较小(几句话)。增加暂停可能会解决问题,但不是理想的解决方案。

任何建议或建议将不胜感激。

最佳答案

我会直接使用 transport 并为每个命令创建一个新 channel 。然后,您可以使用类似:

def issue_command(transport, pause, command):
    chan = transport.open_session()
    chan.exec_command(command)

    buff_size = 1024
    stdout = ""
    stderr = ""

    while not chan.exit_status_ready():
        time.sleep(pause)
        if chan.recv_ready():
            stdout += chan.recv(buff_size)

        if chan.recv_stderr_ready():
            stderr += chan.recv_stderr(buff_size)

    exit_status = chan.recv_exit_status()
    # Need to gobble up any remaining output after program terminates...
    while chan.recv_ready():
        stdout += chan.recv(buff_size)

    while chan.recv_stderr_ready():
        stderr += chan.recv_stderr(buff_size)

    return exit_status, stdout, stderr

ssh = paramiko.SSHClient()
ssh.load_system_host_keys()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(host, port=22, username=username, password=password, timeout=3,)
transport = ssh.get_transport()
pause = 1

resp1 = issue_command(transport, pause, cmd1)
resp2 = issue_command(transport, pause, cmd2)

更好的方法是获取命令列表并为每个命令生成一个新 channel ,轮询每个 chan 的 recv_ready ,并在输出可用时吸收它们的 stdout/stderr。 :-)

编辑:命令退出后读取数据存在潜在问题。请看评论!

关于python - Paramiko:如何确保在命令之间接收数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21083195/

10-14 14:54
查看更多