python - 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
呼叫移动到循环中。
推荐阅读
- python - 将主题视频文件与我们拥有的 csv 数据文件进行比较的最佳方法是什么?
- javascript - 为什么我不能使用这个解析 javascript 代码的 Common Lisp 宏?
- python - 为什么我在 Sklearn 管道中的 OneHotEncoding 后得到的列比预期的多?
- excel - for 循环工作簿中带有公式的工作表,直到带有数据的列的末尾
- kubernetes - k8s 上的 Traefik:仪表板无法访问
- javascript - 使用“parcel index.html”后,外部 .js 不起作用
- javascript - NodeJS 无法修改类 obj
- safari - Vaadin 富文本编辑器组件标记按钮(粗体、斜体等)在 Safari 上不起作用
- sockets - AWS Orocommerce 图像 SMTP 端口 465 不起作用(应用入站规则)
- node.js - 列表中缺少权限