微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Paramiko 在 while 循环中挂在 channel.makefile.read() 上

如何解决Paramiko 在 while 循环中挂在 channel.makefile.read() 上

我一直无法解决这个问题,但我怀疑熟悉 Paramiko/ssh2 的人很容易弄清楚。

下面的代码在只执行一次时可以正常工作,但是当包含在 while 循环中时,它会挂在 stdout.read() 上。我无法使用 exec_command,因为它没有返回正确的输出(我通过 SSH 连接的设备不是标准微控制器,我仍然不确定它使用的究竟是什么编码或 ssh 参数)。由于这有效,我想连续查询设备,但在将命令包装在 while 循环中时它不起作用。

我还尝试更改 while 循环的包装方式,包括从初始 SSH 连接开始包装整个代码块,环绕 channel.close 等。


import paramiko
import time


freewave_shell = paramiko.SSHClient()

freewave_shell.set_missing_host_key_policy(paramiko.AutoAddPolicy())

freewave_shell.connect("an.ip.add.ress",username="user",password="pass")

chan = freewave_shell.invoke_shell()
while (1)

    stdin = chan.makefile_stdin('wb')
    stdout = chan.makefile('rb')

    stdin.write('''
       signalLevel
       noiseLevel
       signalMargin
       VSWR
       exit
            ''')
    print('HERE')
    print(stdout.read()) 


    stdout.close()
    stdin.close()
chan.close()
freewave_shell.close()

解决方法

我认为您的代码不可靠。

但主要问题是,如果关闭 I/O,则必须重新连接通道。因此,您必须将 invoke_shell 调用移动到循环中。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。