Python - 在路由器上使用telnet并列出完整结果(按空格键)
import telnetlib
def telNetCall():
host = "10.200.1.23"
user = "me"
password = "matrix"
telnet = telnetlib.Telnet(host)
telnet.read_until('Username: ', 3)
telnet.write(user + '\r')
telnet.read_until('Password: ', 3)
telnet.write(password + '\r')
telnet.write("sh log"+ "\r\n")
telnet.write('exit' + '\r')
print telnet.read_all()
我的问题是,当我试图从思科路由器获取“显示日志”时,只能得到部分结果。我觉得这是因为你需要按空格键5次(具体次数取决于日志的历史长度)才能看到完整的日志。当我手动操作时可以做到,但我不知道怎么让Python列出完整的日志。有什么建议吗?
3 个回答
3
问题在于如何捕获超过大约20kb的输出……当我把输出记录到文件时,我能获取到所有的输出,但我只想保存一些特定的输出,而不是整个会话。当使用child.after时,输出会被截断,比如开头的部分会丢失,虽然通过增加maxread可以稍微改善,但当输出接近30-40kb时,仍然会出现问题。
有些人可能会好奇,我是通过“sh int | i protocol|Last”来获取Cisco交换机的输出,这个命令每个接口只返回3行,但我客户的一些交换机堆叠有450个端口。
不太确定这里的具体情况,但对于某些交换机来说,这个方法是成功的。
一段时间我尝试通过选择性地开启和关闭文件记录来解决这个问题,但这并不可靠。从通用的日志中我可以看到,pexpect在日志看到输出之前就已经匹配到了输出。我最后不得不在数据仍在写入文件时禁用日志,这导致输出在大约10行后就被截断了。
所以最终的问题是,如何提高child.after的可靠性,以便捕获大输出。我对增加expect语句的超时没有问题,只要输出是可靠的。现在我看到的是没有超时但输出不完整的情况。
child.sendline(action)
child.expect(prompt_keys)
action_output = str(child.after) # Captures the output
# print action_output # Uncomment for debugging grabbed output
output_file.write(action_output + "\n\n\n") # Write the output to file
4
其实这就是问题的准确答案……你需要输入“terminal length 0”,这样路由器的输出就不会像在Unix系统中用“more”命令那样分页显示,而是会让人更容易阅读,不会一下子滚得太快。
import telnetlib
def telNetCall():
host = "10.200.1.23"
user = "me"
password = "matrix"
telnet = telnetlib.Telnet(host)
telnet.read_until('Username: ', 3)
telnet.write(user + '\r')
telnet.read_until('Password: ', 3)
telnet.write(password + '\r')
telnet.write("term length 0"+ "\r\n")
telnet.write("sh log"+ "\r\n")
telnet.write('exit' + '\r')
print telnet.read_all()
5
这不是一个解决办法,但看起来是个可行的替代方案:
你可以通过输入以下命令来关闭终端的分页功能。
terminal length 0