通过 Telnet 协议控制远程设备的 Python 脚本

问题描述

我有一个设备,它使用 Telnet 协议来执行一些命令并获取设备状态。当我使用带有 Telnet 选项的 Putty 应用程序时,设备运行良好。这是一个简单命令的快照以及来自设备的响应:

Putty Terminal

我正在构建一个库来控制在 Linux 操作系统上运行的 Python 3.8 中的这个设备。为此,我使用 telnetlib 库来创建 telnet 会话。但是,设备似乎没有回复我正在执行的命令,并且脚本在 read_all() 处被阻止。这是我的代码

import telnetlib

tn = telnetlib.Telnet('192.168.1.10',2000)
tn.write(b'{"get":"relayStatus"}\r\n')
print(tn.read_all().decode('ascii'))

我使用 Wireshark 进行了数据包捕获,以比较我在 Python 脚本中发送的内容与 putty 发送的内容间的差异。令我惊讶的是,我发现使用 putty 时,命令被拆分为两个数据包。第一个数据包包含消息有效负载,第二个消息包含带有回车符 \r\n 的新行。因此,远程设备似乎回复了我的 PC。 但是,在 Python 脚本情况下,只发送一个包含带有换行符和回车符的命令的数据包。因此,设备不会发回任何信息。

我对这种行为感到惊讶,因为我们讨论的是基于流的连接的 TCP 协议,我们并不关心发送了多少数据包。

这是 Wireshark 捕获的快照: 这是针对Telnet的,可以清楚地看到第一个数据包只包含命令,没有换行:

First Packet Capture when using Putty

第二个数据包的内容

Second Packet Capture when using Putty

这是在 Python 中使用 Telnet 时的快照:

Telnet

注意: 我尝试将写入命令拆分为两个命令,但是,在 Wireshark 中,我看到每个数据包都会收到 TCP ACK,最终没有来自设备的响应。这就是我所做的:

tn.write(b'{"get":"relayStatus"}')
tn.write(b'\r\n')

有人能指出我在这里遗漏了什么吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)