【问题标题】:Paramiko hangs on stdout.readlines() on some llinux devices but works fine on othersParamiko 在某些 llinux 设备上挂在 stdout.readlines() 上,但在其他设备上工作正常
【发布时间】:2019-06-06 01:36:45
【问题描述】:

我正在使用 paramiko 在另一台服务器上执行命令,大多数情况下它工作正常,但对于某些服务器,它在执行几个命令后挂起。

我想知道如何排除故障并了解该问题。

这是我的代码。

import paramiko 

client = paramiko.SSHClient()
client.set_missing_host_ley_policy(paramiko.AutoAddPolicy)
ssh = client.connect('hostname,username,password')
channel = ssh.invoke_shell()

stdin = channel.makefile('wb')
stdout = channel.makefile('r')


stdin.write(cmd+'\n')
stdin.flush()


#it hangs here
for line in stdout: 
    print(line)

【问题讨论】:

  • 1) 不要使用invoke_shell 来自动执行命令。 2) 命令是否产生任何错误输出?
  • 如何在不调用shell的情况下使用标准输入和标准输出??完全没有错误
  • 向我们展示您用于检查错误的代码 + 向我们展示您如何执行多个命令。
  • 我正在使用调用 shell 来执行带有 stdin.write(“bash”) 和 stdin.flush() 的命令“bash”,然后以相同的方式执行第二个命令。如果没有 invoke_shell(),我不知道该怎么做。我没有任何特定的错误处理,当我执行 stdout.readlines() 时它只是卡住而不显示任何错误
  • 好的,所以您不知道这些命令是否会产生任何错误输出? => 阅读stderr = channel.makefile_stderr('rb', bufsize)

标签: python-2.7 stdout paramiko


【解决方案1】:

您编写了一个 for 循环来读取您之前执行的某个命令的输出。 该命令是否连续运行?如果是,则需要连续读取缓冲区。

尝试编写读取逻辑,例如 for line in iter(lambda: stdout.readline(2048), ""): print(line) 因为如果您不指定大小,它会一直读取到 EOF,这会使脚本等到命令结束,然后再从 read() 返回并打印任何输出。
看到这个:Paramiko, exec_command get the output stream continuously

【讨论】:

    猜你喜欢
    • 2013-01-10
    • 2023-03-04
    • 2020-03-11
    • 1970-01-01
    • 2022-11-16
    • 1970-01-01
    • 2018-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多