【问题标题】:telnetlib read_until() Does Not Match Anythingtelnetlib read_until() 不匹配任何内容
【发布时间】:2016-08-17 23:14:47
【问题描述】:

我正在编写一个 Python 脚本来解析来自远程 telnet 服务器端口 10001 上的一些数据。基本上,当我键入时:

$ telnet <host> 10001

终端打印出来:

Trying <host>...
Connected to static-<host>.nycmny.fios.verizon.net.
Escape character is '^]'.
# empty line for prompt

在注释的空行中,我应该输入如下命令('\n' 代表回车):

^Ai20101\n 
# server prints out data 
somedatalinehere
^]
# escape to telnet prompt like below
telnet> 
telnet> quit\n
connection closed.
# returns to local terminal prompt

但是,当我在 Python 中执行此操作时:

tn = telnetlib.Telnet(host, 10001)
tn.read_until("\r\n", timeout=1)     # nothing matched, returns ''
tn.read_until("", timeout=1)         # nothing matched, returns ''
# thus 
tn.write("^Ai20101\n")
time.sleep(0.1)                      # wait 0.1s for next prompt
tn.write("^]")
time.sleep(0.1)
tn.write("quit\n")
tn.read_all()                        # This hangs as if connection wasn't closed.

【问题讨论】:

    标签: python telnet telnetlib


    【解决方案1】:

    实际命令提示符之前的所有输出($ 符号或类似符号)由您自己的 telnet 客户端生成,而不是由服务器生成。

    所以试试下面的方法:

    tn.read_until("$")
    

    如果成功,说明你连接正常,可以发出命令了。


    read_all() 应该“挂起”。引用自docs

    Telnet.read_all()

    读取所有数据直到 EOF; 阻塞直到连接关闭


    编辑:

    实际上,您发布了 no 服务器的响应。正如我之前所说,所有这些都是由客户端生成的。

    # the prompt starts here 是什么意思?我认为这意味着在所有输出之后,您会看到一个命令提示符,看起来像这样:

    ForceBru @ iMac-ForceBru:~ $ 
    

    所以,你应该读到这一行,以确保连接成功。

    【讨论】:

    • 谢谢,但我仍然得到一个空字符串。但是我真的不明白你的解释。你能详细说明吗?我知道$ 是我的客户的提示,但我为什么要使用read_until("$") 阅读它?
    • @PieOhPah,当您仅使用telnet(还没有 Python)成功连接到服务器时,您会从服务器返回此提示。在我的示例中复制并粘贴而不是美元符号。
    • 您能否编辑您的答案,以澄清您在相对于我发布的服务器的响应中要说的内容?这正是服务器回复的内容,并且在任何地方都没有像$这样的提示。
    • 好的,我越来越清楚了。但是,我放置# the prompt starts here 的位置并没有任何提示。甚至没有$。只要空行,我就可以开始输入命令了。
    【解决方案2】:

    我通过使用来自pexpect 的子进程让它工作,它比 telnetlib 灵活得多。

    import pexpect
    import time
    
    child = pexpect.spawn('telnet <host> 10001')
    child.sendcontrol('a')
    child.send('i20101' + '\n')
    

    无需read_until(),就可以了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-11
      • 1970-01-01
      • 1970-01-01
      • 2020-03-10
      • 2016-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多