首页 > 解决方案 > 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()

标签: pythonparamikossh2

解决方案


我认为您的代码几乎不可靠。

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


推荐阅读