Netmiko适配Avocent ACS系列控制台服务器的提示符匹配问题
问题分析与解决方案
你的问题根源在于Netmiko的Linux设备类默认只认以#或$结尾的提示符,但Avocent ACS的提示符是--:- / cli->,导致读取超时。而且你误解了set_base_prompt的alt_prompt_terminator参数的作用:它只是用来从已匹配到的提示符中提取基础前缀(比如从--:- / cli->里抠出--:- / cli作为后续命令的截断标识),但函数执行时第一步还是会用默认的[\$#]正则去读取设备输出,所以依然会超时。
可行解决方案
方案1:提前修改提示符匹配规则
在建立连接前,直接修改Netmiko会话的prompt_pattern为匹配>`的正则,这样后续所有读取提示符的操作都会用新规则:
from netmiko import ConnectHandler from cfslibconfig import CfsLibConfig def get_session(config): device= { "host": config.get_config_key('console_host'), "username": config.get_config_key('console_username'), "password": config.get_config_key('console_password'), "device_type": "linux", "session_log": "netmiko_session.log", "auto_connect": False } session = ConnectHandler(**device) # 替换默认提示符正则,匹配以>结尾的内容 session.prompt_pattern = r'>\s*$' # 现在建立连接,会正确识别设备提示符 session.establish_connection() # 提取基础提示符,用alt_prompt_terminator指定终止符 session.set_base_prompt(alt_prompt_terminator=">") return session
方案2:自定义设备类(更规范)
创建继承自Linux设备类的自定义类,固化提示符匹配规则,后续直接用这个自定义设备类型:
from netmiko import ConnectHandler from netmiko.linux.linux_ssh import LinuxSSH from cfslibconfig import CfsLibConfig # 自定义Avocent ACS设备处理类 class AvocentACSSSH(LinuxSSH): def __init__(self, **kwargs): super().__init__(**kwargs) # 默认匹配以>结尾的提示符 self.prompt_pattern = r'>\s*$' def get_session(config): device= { "host": config.get_config_key('console_host'), "username": config.get_config_key('console_username'), "password": config.get_config_key('console_password'), # 使用自定义设备类 "device_type": AvocentACSSSH, "session_log": "netmiko_session.log", "auto_connect": False } session = ConnectHandler(**device) session.establish_connection() session.set_base_prompt(alt_prompt_terminator=">") return session
为什么之前的代码失效
你之前先调用establish_connection,此时Netmiko已经在等待默认的#/$提示符,而设备返回的是>结尾的内容,所以直接超时。alt_prompt_terminator`参数只是处理已读取到的提示符内容,无法修改Netmiko用来匹配设备输出的底层正则,因此解决不了初始的匹配问题。
内容的提问来源于stack exchange,提问作者Bery Purda
相关产品推荐
相关产品推荐

