为何用Netmiko配置Netgear交换机时出现re.error括号不匹配错误?
这个错误的根源是Netmiko的Netgear ProSafe SSH模块中,配置模式的正则匹配pattern存在未转义的括号,导致正则表达式解析失败。
从报错回溯能看到,错误发生在config_mode()方法里的正则匹配步骤——Netgear交换机的配置模式提示符通常是(config)#,而括号()在正则表达式里是特殊字符(用于分组),如果没有转义的话,正则引擎会认为括号未平衡,直接抛出sre_constants.error: unbalanced parenthesis。
解决办法
你有几种可行的修复方式:
1. 调用send_config_set时手动指定配置模式的匹配pattern
在调用send_config_set时,通过cfg_mode_args传递正确转义的正则pattern,跳过模块自带的错误pattern:
Netgear_M4100_66={'device_type':'netgear_prosafe', 'host':'172.16.97.66', 'username':'admin', 'password':'******', } all_devices=[Netgear_M4100_66] config_commands=['interface vlan 97'] for device in all_devices: net_connect = ConnectHandler(**device,fast_cli=True) net_connect.enable() # 手动指定配置模式的匹配pattern,用原始字符串转义括号 net_connect.send_config_set(config_commands, cfg_mode_args={'pattern': r'\(config\)#'}) output=net_connect.send_command('show port status all') print("\n\n------------- Device {0} = {1} -------------".format(device['device_type'],device['host'])) print(output) print("----------- End ------------")
2. 单独调用config_mode时指定正确的pattern
如果你需要先手动进入配置模式,也可以直接在config_mode方法里传入转义后的pattern:
net_connect.enable() # 先进入配置模式,指定正确的匹配正则 net_connect.config_mode(pattern=r'\(config\)#') net_connect.send_config_set(config_commands, exit_config_mode=False)
3. 临时修改Netmiko的Netgear模块代码(不推荐,除非长期使用)
找到你的Netmiko安装路径下的netgear_prosafe_ssh.py文件(比如/usr/local/lib/python3.8/dist-packages/netmiko/netgear/netgear_prosafe_ssh.py),修改config_mode方法的默认pattern:
原代码可能是:
def config_mode(self, config_command="configure", pattern=r"(config)#", re_flags=re.IGNORECASE): return super().config_mode(config_command=config_command, pattern=pattern)
修改为:
def config_mode(self, config_command="configure", pattern=r"\(config\)#", re_flags=re.IGNORECASE): return super().config_mode(config_command=config_command, pattern=pattern)
这样后续调用就不需要每次手动指定pattern了,但注意升级Netmiko后会覆盖这个修改。
为什么Python版本升级没用?
这个问题和Python版本无关,是Netmiko模块对Netgear交换机提示符的正则匹配写得有问题,不管Python3.6还是3.8,正则引擎对未转义括号的处理逻辑是一致的,所以升级Python无法解决。
内容的提问来源于stack exchange,提问作者Antouil

