Netmiko执行show version遇Pattern Not Detected问题求助
问题:Netmiko连接Cisco IOS XR设备时自动匹配提示符失败,仅指定expect_string可正常运行
环境与代码
使用Netmiko 4.2.0连接Cisco IOS XR设备执行show version,代码如下:
from netmiko import ConnectHandler device_cisco_ios = { 'device_type': 'cisco_ios', 'host': "ABCDEF32", 'username': "XXXX", 'password': "xxxxx", "session_log": 'netmiko_session.log', } try: with ConnectHandler(**device_cisco_ios) as ssh: cmd = ssh.send_command("sh ver") print(cmd) except Exception as e: print(str(e))
会话日志(netmiko_session.log)
Last login: Fri Oct 27 17:57:36 2023 from 10.245.246.24 terminal width 511 terminal length 0 RP/0/RP0/CPU0:ABCDEF32# RP/0/RP0/CPU0:ABCDEF32#terminal width 511 RP/0/RP0/CPU0:ABCDEF32#terminal length 0 sh ver RP/0/RP0/CPU0:ABCDEF32# RP/0/RP0/CPU0:ABCDEF32# RP/0/RP0/CPU0:ABCDEF32# RP/0/RP0/CPU0:ABCDEF32# RP/0/RP0/CPU0:ABCDEF32# RP/0/RP0/CPU0:ABCDEF32#sh ver Cisco IOS XR Software, Version 7.3.3 LNT Copyright (c) 2013-2022 by Cisco Systems, Inc. Build Information: Built By : xxxx Built On : xxx Build Host : xxx Workspace : XXXX Version : 7.3.3 Label : 7.3.3 cisco 8000 (Intel(R) Xeon(R) CPU D-1530 @ 2.40GHz) cisco 8201-32FH (Intel(R) Xeon(R) CPU D-1530 @ 2.40GHz) processor with 32GB of memory ABCDEF32 uptime is 24 weeks, 11 hours, 15 minutes Cisco 8000 Series 32x400G QSFPDD 1RU Fixed System w/HBM RP/0/RP0/CPU0:ABCDEF32# RP/0/RP0/CPU0:ABCDEF32#exit
报错信息
Pattern not detected: 'RP/0/RP0/CPU0:ABCDEF32\\#terminal\\ length\\ 0' in output. Things you might try to fix this: 1. Explicitly set your pattern using the expect_string argument. 2. Increase the read_timeout to a larger value. You can also look at the Netmiko session_log or debug log for more information.
已尝试操作
- 增加
read_timeout时长,无效; - 检查空白字符或控制字符(十六进制转储),未发现异常;
- 仅指定
expect_string="ABCDEF32#"时,代码可正常运行。
疑问:为何不指定expect_string时自动匹配失败,且同一设备有时能正常运行?
解答
核心原因
- 设备类型配置错误:你使用的
device_type是cisco_ios,但目标设备是Cisco IOS XR系统。Netmiko针对cisco_ios预设的提示符匹配规则,无法兼容IOS XR的长格式提示符(RP/0/RP0/CPU0:ABCDEF32#),导致自动匹配逻辑混乱。 - 动态匹配的歧义问题:Netmiko默认会基于初始获取的提示符生成匹配规则,执行
terminal length 0等命令时,输出中出现的RP/0/RP0/CPU0:ABCDEF32#terminal length 0会被错误识别为目标提示符,而非命令本身,触发匹配失败。
解决方法
- 修正设备类型:将设备配置中的
device_type改为cisco_xr,Netmiko针对IOS XR有专门的提示符匹配逻辑,能正确识别RP/0/RP0/CPU0:ABCDEF32#格式的提示符:
device_cisco_xr = { 'device_type': 'cisco_xr', 'host': "ABCDEF32", 'username': "XXXX", 'password': "xxxxx", "session_log": 'netmiko_session.log', }
- 全局设置基础提示符:若无法修改
device_type,可在连接后设置全局匹配规则,避免每次命令都手动指定:
with ConnectHandler(**device_cisco_ios) as ssh: ssh.set_base_prompt(prompt_pattern=r'RP/0/RP0/CPU0:\w+#') cmd = ssh.send_command("sh ver") print(cmd)
- 命令级指定提示符:保持现有配置的情况下,每次调用
send_command时明确指定expect_string,比如通用正则表达式expect_string=r'RP/0/RP0/CPU0:ABCDEF32#'。
补充说明
同一设备偶尔能正常运行的原因:当设备返回提示符的时机恰好符合cisco_ios的模糊匹配规则时,会偶然成功,但这种情况不可靠,必须通过修正设备类型或明确提示符规则彻底解决。
内容的提问来源于stack exchange,提问作者Bharath Reddy
相关产品推荐
相关产品推荐

