使用Python telnetlib配置Cisco路由器时遇按键阻塞,求自动跳过方案
解决Telnet操作Cisco路由器时的按键阻塞问题
我之前在配置Cisco设备的时候也踩过这个坑,给你几个靠谱的解决思路:
1. 从设备端彻底关闭分页提示(首选方案)
绝大多数情况下,这种“press a key to continue”的提示都是因为设备开启了分页显示(输出内容过长时自动截断),只需要登录后发送terminal length 0命令就能彻底关闭分页,让设备一次性输出所有内容,再也不会出现按键提示。
操作示例:
import telnetlib # 建立Telnet连接 tn = telnetlib.Telnet("你的路由器IP") # 登录流程 tn.read_until(b"Username: ") tn.write(b"你的用户名\n") tn.read_until(b"Password: ") tn.write(b"你的密码\n") # 发送关闭分页命令 tn.write(b"terminal length 0\n") # 等待设备返回提示符(比如路由器的hostname#) tn.read_until(b"#") # 接下来执行你的配置命令就不会碰到按键阻塞了 tn.write(b"show running-config\n") # 读取输出 output = tn.read_all().decode('ascii') print(output)
2. 检测提示并自动发送按键( fallback方案)
如果因为权限限制或者设备特殊配置没法关闭分页,那可以在代码里监听“press a key to continue..”的提示,一旦检测到就自动发送一个换行(或空格)来跳过。
示例代码:
import telnetlib tn = telnetlib.Telnet("你的路由器IP") # 登录步骤同上... # 执行可能触发分页的命令 tn.write(b"show version\n") # 循环检测按键提示 while True: # 等待提示出现,超时5秒 output_chunk = tn.read_until(b"press a key to continue..", timeout=5) if b"press a key to continue.." in output_chunk: # 发送换行键跳过提示 tn.write(b"\n") else: # 没有检测到提示,退出循环 break # 读取剩余输出 full_output = tn.read_until(b"#").decode('ascii') print(full_output)
注意:不同设备的提示字符串可能有细微差异(比如大小写、标点),要根据实际设备的输出调整read_until里的字节串(比如可能是b"Press any key to continue...")。
3. 使用expect方法更灵活匹配模式
telnetlib的expect方法可以同时匹配多个模式,比如同时监听设备提示符和按键提示,逻辑会更清晰:
from telnetlib import Telnet with Telnet("你的路由器IP") as tn: # 处理登录 tn.expect([b"Username: "]) tn.write(b"你的用户名\n") tn.expect([b"Password: "]) tn.write(b"你的密码\n") # 执行命令 tn.write(b"show ip route\n") # 循环处理提示 while True: # 匹配提示符(idx=0)或按键提示(idx=1) idx, _, _ = tn.expect([b"#", b"press a key to continue.."], timeout=10) if idx == 0: # 匹配到提示符,说明命令执行完成 break elif idx == 1: # 发送换行跳过提示 tn.write(b"\n") # 读取完整输出 output = tn.read_all().decode('ascii') print(output)
总结一下,优先用terminal length 0解决,这是最彻底的方式;如果不行再用自动发送按键的方法,根据实际情况调整匹配的字符串就行。
内容的提问来源于stack exchange,提问作者Bad-3




