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

Python's telnetlib "read_until()" not receiving expected string

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)

我假设 "read_until()" 没有收到任何东西,因此一直在等待直到超时,但我不明白为什么。

(我已经使用 "expect" 编写了相同的脚本,它工作得很好,但我想看看我是否可以让它在 python 中工作以提高效率......所以关于发送的任何评论八进制字符串值得赞赏,但这不是这个问题的目的。

谢谢。

你的"problem"是那个

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

是您可以从 shell/command 行执行的操作,这是命令行客户端的一项功能。这就是 expect 起作用的原因,因为它会启动该客户端。

在这种情况下,使用telnetlib,"you"是"client",所以你必须"speak telnet"到服务器,这意味着你必须发送一些IAC + [DO|DONT|WILL|WONT] + ... 序列,当你做 mode char 时命令行做同样的事情,有 this 其他线程谈论序列 should/could 是什么,但你也可以使用 tcpdump(或类似的工具)来检查命令行客户端在调用 mode char 时发送的内容(只是为了 100% 确定)。

发送就像做这样的事情:

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