【问题标题】:How can I read multiple lines from a telnet query in Python?如何从 Python 中的 telnet 查询中读取多行?
【发布时间】:2015-03-26 02:09:59
【问题描述】:

我正在尝试使用 Python 的 telnetlib 模块与设备通信。我似乎能够建立连接并将我的查询传递给设备,但是,输出不是我所期望的。

这是我的简化代码:

import telnetlib
import time

HOST = "10.10.10.71"

tn = telnetlib.Telnet(HOST, port=55555, timeout=60)

time.sleep(5)                # Give the processor time to connect

tn.write(b'v' + b'\r\n')     # Get the processor version, using 'v'

print(tn.read_eager().decode('utf-8'))

tn.close()                   # Close the connection

执行这段代码后,所有终端显示为:mpa:? -- 不是我期待的处理器信息。

当我使用 Telnet 客户端时,在建立连接后,我会收到 mpa:? 提示,这表明设备已准备好接受我的命令。然后我输入“v”,它应该会产生这种格式的输出:

mpa:? v

FIRMWARE CONFIGURATION:
Processor Firmware Type
Build Number
Copyright Info

HARDWARE CONFIGURATION:
Line 1          - xxxx
Line 2          - xxxx
Line 3          - xxxx
...

mpa:?

查询完成后,会显示mpa:?提示符,为下一个命令做好准备。

代替print(tn.read_eager().decode('utf-8')),我也尝试过print(tn.read_all().decode('utf-8')),但超时并显示以下错误消息:

Traceback (most recent call last):
File "C:/Python/Telnet_logger_1.py", line 14, in <module>
print(tn.read_all().decode('utf-8'))
File "C:\Python34\lib\telnetlib.py", line 335, in read_all
self.fill_rawq()
File "C:\Python34\lib\telnetlib.py", line 526, in fill_rawq
buf = self.sock.recv(50)
socket.timeout: timed out

谁能指出我正确的方向,或者让我知道我做错了什么?

非常感谢!!

【问题讨论】:

  • 我怀疑您需要先阅读设备返回的mpa:? 提示,然后再尝试向其发送命令。您是否尝试过类似tn.read_until(b"mpa:?") 的方法,类似于the docs 中的示例?
  • @PM2Ring - 感谢您的建议。我试图删除 time.sleep(5) 并用 tn.read_until(b"mpa:?") 替换它 - 当我使用 tn.read_all() 时仍然出现超时错误,而当我使用 tn.read_eager() 时,我根本没有得到任何输出。跨度>
  • 我不知道该建议什么。我对 telnetlib 的经验有限,但我已经成功地使用它(在 Python 2.6 中)与我的 ADSL 调制解调器进行通信。由于调制解调器总是以命令提示符终止其输出,因此我使用tn.read_until(prompt) 从中读取数据。

标签: python telnet python-3.4 telnetlib


【解决方案1】:

我已经解决了这个问题,方法是添加一个while循环来打印新行和回车后的每一行:

import telnetlib

HOST = "10.10.10.71"

tn = telnetlib.Telnet(HOST, port=55555, timeout=60)

tn.read_until(b"mpa:?")

tn.write(b'v' + b'\n\r')

while True:
    line = tn.read_until(b"\n\r")  # Check for new line and CR
    print(line)
    if (b"mpa:?") in line:   # If last read line is the prompt, end loop
        break

tn.close()

【讨论】:

    猜你喜欢
    • 2013-04-21
    • 1970-01-01
    • 2014-05-05
    • 2020-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-27
    • 1970-01-01
    相关资源
    最近更新 更多