telnetlib 执行无响应和超时
telnetlib execution not responding and timing out
几个小时以来,我一直在尝试通过 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 Horizons 的欢迎屏幕和提示 system-the 提示符是“Horizons>
”,此时我希望程序输入退出代码“x”并进入。但是,程序没有响应,没有向终端打印任何内容并超时 (TimeoutError: [Errno 60] Operation timed out
)。错误日志表明错误来自 telnetlib.py
的 create_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
(或至少不打印结果),然后不结束程序,让我停留在“地平线>”提示上。
您忘记使用端口了。您也没有将正确的参数传递给 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"))
您没有在任何地方使用您的 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())
几个小时以来,我一直在尝试通过 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 Horizons 的欢迎屏幕和提示 system-the 提示符是“Horizons>
”,此时我希望程序输入退出代码“x”并进入。但是,程序没有响应,没有向终端打印任何内容并超时 (TimeoutError: [Errno 60] Operation timed out
)。错误日志表明错误来自 telnetlib.py
的 create_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
(或至少不打印结果),然后不结束程序,让我停留在“地平线>”提示上。
您忘记使用端口了。您也没有将正确的参数传递给 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"))
您没有在任何地方使用您的 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())