Netmiko发送批量SNMP Trap配置命令时出现ReadTimeout错误
解决Netmiko发送多行配置命令的ReadTimeout问题
问题根源
- 错误使用
send_command处理配置命令:send_command是为执行单条查询类(如show)命令设计的,不适合处理多行配置命令,它无法正确识别配置模式下的提示符变化,最终导致超时。 - 字符串拼接格式错误:用
" ".join(matches)会把配置内的换行替换成空格,导致命令格式混乱,设备无法正确解析。 - 重复建立连接:无需断开后重新连接,同一个会话即可完成接口获取与配置下发操作,减少冗余开销。
修复后的代码
import re from netmiko import ConnectHandler # 设备信息配置 device = { 'device_type': 'cisco_ios', 'ip': '10.10.10.103', 'username': 'cisco', 'password': 'cisco', 'port': 22, } # 单次连接完成所有操作 with ConnectHandler(**device) as net_connect: # 获取接口列表 output = net_connect.send_command('sh ip int bri') # 正则匹配有效接口(过滤表头、空行等无效内容) matches = re.findall(r'^Ethernet\d+/\d+|^GigabitEthernet\d+/\d+', output, flags=re.M) # 生成配置命令列表(用列表存储比字符串拼接更稳定) config_commands = [] for intf in matches: config_commands.extend([ f'interface {intf}', 'snmp trap mac-notification change added', 'snmp trap mac-notification change removed' ]) # 发送配置命令,send_config_set会自动进入config t,执行完成后退出 config_output = net_connect.send_config_set(config_commands) print(config_output) # 可选:保存配置 save_output = net_connect.send_command('write memory') print(save_output)
关键修改说明
- 改用
send_config_set:该方法专门用于下发配置命令,会自动处理进入/退出配置模式的流程,能正确识别配置模式下的提示符,从根源避免超时问题。 - 优化正则匹配:精确匹配以太网/千兆以太网接口,过滤掉
sh ip int bri输出中的表头、空行等无效内容,避免处理非接口条目。 - 用列表存储配置命令:Netmiko的
send_config_set支持直接传入命令列表,内部会自动处理换行与执行顺序,比拼接大字符串更可靠。 - 单次连接完成操作:减少连接建立的开销,避免重复连接可能引发的异常。
额外调试建议
- 若仍遇超时,可在
send_config_set中增加超时参数:net_connect.send_config_set(config_commands, read_timeout=30) - 开启会话日志排查:在device字典中添加
'session_log': 'netmiko_session.log',可查看设备与脚本的交互细节,定位问题。
内容的提问来源于stack exchange,提问作者Jt.netcompute
相关产品推荐
相关产品推荐

