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 列出完整日志。有什么建议吗?

有帮助吗?

解决方案

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

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

端子长度0

其他提示

这实际上是准确的答案......你必须输入终端长度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() 

然后,问题变成了如何捕获大于20kb的输出...登录文件时,我将获得所有输出,但我只想保存选择性输出,而不是整个会话。使用孩子时。输出被截断后,例如,丢失的开始,可以通过增加MaxRead来稍微减轻一点,但是在接近30-40kb输出的输出接近时仍会炸弹。

对于那些想知道的人,我使用“ sh int | i协议|最后”抓住思科开关的输出,这仅返回每个接口3行,但我的某些客户的开关堆栈具有450个端口。

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

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

因此,最终的问题仍然存在,如何提高儿童的可靠性。为了捕获大输出。只要输出可靠,我就不会增加预期语句的超时。我现在看到的不是输出不完整的超时。

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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top