Python - 路由器上的telnet和列表完整结果(点击空格键)

时间:2010-09-11 10:25:48

标签: python router telnetlib

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

我的问题是,当我尝试从cisco路由器中获取“show log”时,它只给出了部分结果,我认为这是因为你需要按空格键5次(取决于日志历史记录有多长)才能获得完整的日志 - 当我这样做manualy,我不知道如何告诉python列出完整的日志。有什么建议吗?

3 个答案:

答案 0 :(得分:5)

不是解决方案,但似乎是一种似是而非的解决方法:

您可以通过发出以下IOS CLI命令来禁用终端分页。

  

终端长度0

答案 1 :(得分:4)

它实际上是确切的答案.....你必须输入终端长度0或路由器页面输出就像使用unix“更多”这样它是人类可读的并且不只是快速滚动

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

答案 2 :(得分:3)

然后问题变成如何捕获大于约20kb的输出...当记录到文件时我获得所有输出但我只想保存选择性输出,而不是整个会话。当使用child.after输出被截断后,例如开始丢失,可以通过增加maxread减轻一点,但是当接近30-40kb的输出时它仍然会爆炸。

对于那些想知道的人,我正在使用“sh int | i protocol | Last”获取Cisco交换机的输出,这只返回每个接口3行,但我客户的一些交换机堆栈有450个端口。

不确定这里的动态是什么,但对于某些开关,它确实成功了。

有一段时间我试图通过有选择地打开和关闭日志记录来解决这个问题。这被证明是不可靠的,从通用日志记录中我可以看到pexpect在日志记录之前匹配输出方式。当数据仍在写入文件时,我最终禁用了日志记录。在大约10行输出后截断输出。

所以最终的问题仍然存在,如何才能提高孩子的可靠性。为了捕获大量输出。只要输出可靠,我就没有增加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