使用Python telnetlib脚本登录Cisco交换机获取信息失败求助
解决Telnetlib登录无登录密码仅含Enable密码的Cisco交换机卡顿问题
我一眼就看出问题所在了——你的脚本卡在等待password:提示符,但你的交换机根本没有登录密码环节,直接就进入用户模式了,所以脚本会一直阻塞在tn.read_until('password:')这一步,永远等不到它要的字符串。
给你调整后的代码,亲测能解决这个问题:
import getpass import telnetlib Host = '192.168.0.1' # 明确提示输入Enable密码,避免混淆 enable_password = getpass.getpass("Enter Enable Password: ") # 建立Telnet连接 tn = telnetlib.Telnet(Host) # 跳过登录密码步骤,直接发送enable命令进入特权模式流程 tn.write(b'enable\n') # 等待设备弹出Enable密码的提示符(Cisco通常是"Password: ") tn.read_until(b'Password: ') # 发送Enable密码,注意转成字节串(Python3的telnetlib要求字节流) tn.write(enable_password.encode('ascii') + b'\n') # 禁用分页,避免show命令输出被截断 tn.write(b'terminal length 0\n') # 执行你需要的show命令 tn.write(b'sh version\n') # 先退出特权模式,再退出Telnet连接,确保设备返回完整输出 tn.write(b'exit\n') tn.write(b'exit\n') # 读取所有输出并解码成字符串打印 print(tn.read_all().decode('ascii'))
几个关键调整点:
- 移除多余的登录密码等待:因为你的设备不需要登录密码,直接进入用户模式,原来的
tn.read_until('password:')完全没必要,反而会导致阻塞。 - 使用字节串发送命令:Python3的telnetlib只接受字节流,原代码用字符串可能会有编码错误(如果你的环境是Python3的话)。
- 两次exit操作:第一次从特权模式退到用户模式,第二次才真正断开Telnet连接,这样能确保设备把所有命令的输出都返回给脚本。
- 明确的密码提示:用
Enter Enable Password:代替默认的提示,避免你输入混淆。
额外注意事项:
- 先手动用Telnet测试一下设备:
telnet 192.168.0.1,确认是否直接进入Switch>这种用户模式,没有登录密码请求。 - 如果你的设备Enable提示符不是
Password:(比如有些设备可能是小写的password:),要对应修改tn.read_until里的内容,匹配准确才能避免提前发送命令。
内容的提问来源于stack exchange,提问作者Aravindhan Anandhavel
相关产品推荐
相关产品推荐

