Python的telnetlib" read_until()"未收到预期的字符串

时间:2016-09-06 11:08:24

标签: python telnet telnetlib

python的新手,但我试图自动打开一个telnet会话(使用内置的" telnetlib"库)到路由器,执行一个简单的命令(" spc"),打印输出到本地控制台然后离开。

#!/usr/bin/python

import sys
import telnetlib

HOST="54.18.5.0"
PORT=55555

tn=telnetlib.Telnet(HOST, PORT)

tn.read_until("Escape character is \'^]\'.")
tn.write("\u001d")
tn.read_until("telnet>")
tn.write("mode char" + "\n")

tn.write("spc\n")

print tn.read_all()

我的问题似乎在于" read_until"功能。当我运行上面的脚本时,它将挂起,直到键盘中断,此时我收到以下消息:

CTraceback (most recent call last):
File "./telnetMR.py", line 11, in <module>
tn.read_until("Escape character is \'^]\'.")
File "/usr/lib64/python2.7/telnetlib.py", line 294, in read_until
return self._read_until_with_poll(match, timeout)
File "/usr/lib64/python2.7/telnetlib.py", line 318, in _read_until_with_poll
else 1000 * call_timeout)

我假设&#34; read_until()&#34;没有收到任何东西,因此等到超时,但我不明白为什么。

(我使用&#34编写了相同的脚本;期望&#34;它工作得很好但是我想看看我是否可以在python中使用它来提高效率...所以关于发送八进制字符串的任何评论感谢,但这不是这个问题的原因。)

谢谢。

1 个答案:

答案 0 :(得分:0)

你的问题&#34;就是那个

tn.write("\u001d")
tn.read_until("telnet>")

是您可以从shell /命令行执行的操作,它是命令行客户端的一项功能。这就是为什么期望有效,因为它启动了该客户。

在这种情况下,使用telnetlib,&#34;你&#34;是&#34;客户&#34;,所以你必须&#34;说telnet&#34;到服务器,这意味着你必须发送一些IAC + [DO|DONT|WILL|WONT] + ...序列,这​​与你mode char时命令行所做的相同,那里有this其他线程讨论序列应该/可能是什么,但您也可以使用tcpdump(或类似工具)来检查命令行客户端在调用mode char时发送的内容,(只是为了100%肯定)。

发送它的事情是这样的:

tm.sock.send(telnetlib.IAC+telnetlib.DO+ ...) # ... whatever the sequence is