【问题标题】:telnetlib execution not responding and timing outtelnetlib 执行无响应和超时
【发布时间】:2021-04-09 01:16:35
【问题描述】:

几个小时以来,我一直在尝试通过 telnetlib 连接到 telnet 服务。我一直在尝试使用 telnetlib 来读取内容并与远程服务进行交互。我一直在使用此代码进行测试(使用 Python 3.9 版)

import telnetlib

HOST = "horizons.jpl.nasa.gov"
port = "6775"                                                                                                                                                                              

tn = telnetlib.Telnet(HOST)
tn.open()                                                                                                                                                                            

print(tn.read_until("Horizons> "))
tn.write("x\r")
tn.close()

print(tn.read_all())

我希望看到 JPL Horizo​​ns 系统的欢迎屏幕和提示符——提示符是“Horizons> ”,此时我希望程序输入退出代码“x”并进入。但是,程序没有响应,终端没有打印任何内容并超时(TimeoutError: [Errno 60] Operation timed out)。错误日志表明错误来自telnetlib.pycreate_connection函数,具体是sock.connect(sa)。 我的代码有问题吗?如何确保建立连接并打印服务的输出以供使用?

如果没有:有没有其他方法可以使用 Python 自动进行 telnet 通信和读取输出?

-=更新=- 用另一个命令替换最初的tn.write(b"x\r"),试图从连接中实际获取一些内容和信息:

tn.write(b"sun\r")
tn.read_until(b" Select ... [E]phemeris, [F]tp, [M]ail, [R]edisplay, ?, <cr\
>:")
tn.write(b"x\r")
tn.read_until(b"Connection closed by foreign host.")
info = tn.read_until(b"Connection closed by foreign host.")
tn.close()
print(info)
print(tn.read_all().decode("utf-8"))

只打印到第一个提示,不输入sun\r(或者至少不打印结果),然后不结束程序,让我停留在“地平线>”提示。

【问题讨论】:

  • 查看我的答案的更新,它解决了您更新的问题。

标签: python telnet telnetlib


【解决方案1】:

您没有在任何地方使用您的 port 变量,因此 telnetlib 正在尝试连接到端口 23。试试这个:

import telnetlib

HOST = "horizons.jpl.nasa.gov"
port = "6775"                                                                                                                                                                              

tn = telnetlib.Telnet(HOST, port)
print(tn.read_until(b"Horizons> "))
tn.write(b"x\r")
tn.close()

print(tn.read_all())

还要注意,您需要向 telnetlib 函数提供字节而不是字符串。


更新 1

看起来您应该发送\n 来终止命令,而不是\r。以下代码适用于我:

import sys
import telnetlib
import time

HOST = "horizons.jpl.nasa.gov"
port = "6775"                                                                                                                                                                              

with telnetlib.Telnet(HOST, port) as tn:
    tn.read_until(b"\r\nHorizons> ")
    tn.write(b"sun\n")
    data = tn.read_until(b" Select ... [E]phemeris, [F]tp, [M]ail, [R]edisplay, ?, <cr>:")
    tn.write(b"x\n")
    tn.read_all().decode("utf-8")

print('--- data ---')
print(data.decode())

【讨论】:

  • 好吧,看起来@kichik 也比我快了 20 秒... :)
  • 效果很好!我对该解决方案的一个问题是终端中打印的输出充满了间隙\r\r\n,这使得它难以阅读。我很确定 \r\r\n 应该作为新行打印,但是为什么要逐字打印呢?
  • 因为这段代码正在打印bytes 对象。如果将字节解码为字符串 (print(tn.read_all().decode())),它将按预期呈现。
【解决方案2】:

您忘记使用端口了。您也没有将正确的参数传递给 open() 或按照库的要求传递字节。这是一个工作示例。

import telnetlib

HOST = "horizons.jpl.nasa.gov"
port = 6775

with telnetlib.Telnet(HOST, port) as tn:
                                                                                                                                                                            
    print(tn.read_until(b"Horizons> ").decode("utf-8"))
    tn.write(b"x\r")
    tn.close()

    print(tn.read_all().decode("utf-8"))

【讨论】:

  • 妈的,就这么简单,哇。我认为我遇到的[多个]错误的一部分是由输入字符串而不是字节引起的——我不知道字符串到字节的转换是如何工作的。我认为这非常有效。谢谢!
猜你喜欢
  • 2011-12-31
  • 1970-01-01
  • 2016-06-01
  • 1970-01-01
  • 2021-12-03
  • 2016-07-27
  • 2014-09-21
  • 2013-09-11
  • 1970-01-01
相关资源
最近更新 更多