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