1
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 路由器获取“显示日志”时,它只给了我部分结果,我认为这是因为您需要按空格键 5 次(取决于日志历史记录的时间长短)才能获得完整的日志-当我手动执行时,我不知道如何告诉 python 列出完整日志。有什么建议吗?

4

3 回答 3

5

不是解决方案,但似乎是一个合理的解决方法:

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

终端长度 0

于 2010-09-11T10:48:04.147 回答
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() 
于 2011-02-08T15:17:33.377 回答
3

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

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

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

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

所以最终的问题仍然存在,如何提高 child.after 的可靠性。为了捕获大量输出。只要输出可靠,我对增加期望语句的超时没有任何问题。我现在看到的是输出不完整的超时。

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
于 2012-11-27T13:41:18.413 回答