telnetlib read_until()不匹配任何内容

时间:2016-04-24 16:18:51

标签: python telnet telnetlib

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

$ 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.

2 个答案:

答案 0 :(得分:1)

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

请尝试以下内容:

tn.read_until("$")

如果此操作成功,则表示您已连接好并可能发出命令。

read_all() 应该&#39;挂起&#39;引自docs

  

Telnet. read_all()

     

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

修改

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

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

ForceBru @ iMac-ForceBru:~ $ 

因此,您应该阅读此行,以确保连接成功。

答案 1 :(得分:0)

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

read_until()

无需{{1}},这只是有效。