Netmiko执行Cisco控制器配置保存时确认指令传递问题求助
解决Netmiko执行Cisco控制器save config的确认问题
我太懂你遇到的这个糟心问题了!之前用send_command分开发或者组合发都不管用,核心原因是**send_command默认是等待设备的命令提示符(比如controller#)才会结束当前命令的发送**,但执行save config后,设备弹出的是交互提示save config? y/n,不是命令提示符——所以单独发y的时候,设备根本没在等待命令输入,自然识别不了;而save config y这种组合命令,设备只会执行save config,后面的y会被直接忽略,因为它不是这个命令的合法参数。
针对这种需要响应交互提示的场景,Netmiko专门提供了两个适配的方法,我给你详细拆解怎么用:
方法1:用send_command_timing(简单快速)
这个方法是基于时间等待而非提示符匹配,刚好能适配这种需要手动确认的流程:
# 发送save config命令,等待设备弹出确认提示 net_connect.send_command_timing('save config') # 发送确认的y,完成保存操作 net_connect.send_command_timing('y')
这个方法的好处是写法简单,适合网络环境稳定、延迟不高的场景;如果设备响应偏慢,还可以通过delay_factor参数增加等待时间,比如send_command_timing('save config', delay_factor=2)。
方法2:用send_interactive(更可靠精准)
如果想要更稳定的交互(比如精准匹配特定提示,避免误操作),推荐用send_interactive,它可以明确定义每一步的命令和对应的预期提示:
# 定义完整的交互流程 output = net_connect.send_interactive( commands=[ # 第一步:发送save config命令 'save config', # 第二步:当设备弹出确认提示时,发送y,并匹配保存成功的反馈 {'command': 'y', 'expect_string': r'Your configuration has been saved\.'} ], # 第一步命令发送后,要匹配的确认提示(根据你设备的实际输出调整正则) expect_string=r'save config\? y/n' ) # 打印交互过程的输出,验证保存结果 print(output)
关键注意点:
- 一定要根据你设备的实际输出调整正则表达式!比如如果你的设备提示是
Save configuration? [y/n],那expect_string就要改成r'Save configuration\? \[y/n\]',记得转义?、[、]这类特殊字符。 send_interactive会返回整个交互过程的输出,你可以通过输出内容直接验证是否保存成功。- 如果设备保存完成后会回到命令提示符,也可以把第二步的
expect_string改成设备的提示符正则,比如r'controller#'(根据实际提示符调整)。
这样操作后,就能正确触发save config的确认流程,顺利完成配置保存啦!
内容的提问来源于stack exchange,提问作者Ofek Glick
相关产品推荐
相关产品推荐

