Python - 在路由器上远程登录并列出完整结果(按空格键)
题
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
不隶属于 StackOverflow