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中使用它来提高效率...所以关于发送八进制字符串的任何评论都很受欢迎但是这不是什么问题是) .
谢谢 .
1 回答
你的“问题”是这样的
您可以从shell /命令行执行此操作,这是命令行客户端的一项功能 . 这就是期望有效的原因,因为它启动了该客户端 .
在这种情况下,使用telnetlib,"you"是"client",所以你必须"speak telnet"到服务器,这意味着你必须发送一些
IAC + [DO|DONT|WILL|WONT] + ...
序列,这与你做mode char
时命令行的作用相同,那里有this其他线程讨论序列应该/可能是什么,但你也可以使用tcpdump(或类似的工具)来检查命令行客户端在调用mode char
时发送的内容,(只是为了100%肯定) .发送它是做一些事情的事情: