使用TextFSM解析Cisco路由器con/aux/vty配置的对齐问题
解决Cisco Line配置TextFSM解析错位问题
问题背景
使用TextFSM解析Cisco路由器show running-config | partial line输出时,部分vty配置未以!结尾,导致记录边界识别错误,字段匹配出现错位(如LOGIN_AUTHENTICATION字段被绑定到错误的LINE_TYPE)。
期望提取字段
需提取的结构化字段如下:
{ "LINE_TYPE": "con/aux/vty", "LINE_NUM": "number", "ACCESS_CLASS": "number", "EXEC_TIMEOUT": "number", "LOGIN_AUTHENTICATION": "string", "STOPBITS": "number" }
命令输出示例
line con 0 exec-timeout 0 0 login authentication autCON stopbits 1 ! line aux 0 stopbits 1 login authentication autAUX line vty 0 4 exec-timeout 1 0 login authentication autAAA line vty 5 15 exec-timeout 2 0 login authentication autBBB password yourmom line vty 16 access-class 55 in vrf-also exec-timeout 3 0 login authentication autCCC !
原模板及错误结果
原TextFSM模板
Value Required LINE_TYPE (\S+) Value LINE_NUM (\S.*) Value EXEC_TIMEOUT (\d+ \d+|\S+) Value STOPBITS (\d+) Value TRANSPORT (\S+) Value AUTHORIZATION (\S+) Value ACCOUNTING_CONNECTION (\S.*) Value ACCOUNTING_EXEC (\S+) Value LOGIN_AUTHENTICATION (\S+) Value HISTORY_SIZE (\d+) Value ACCESS_CLASS (\S+.*) Start ^line ${LINE_TYPE} ${LINE_NUM} -> Continue.Record ^\s*exec-timeout ${EXEC_TIMEOUT}* ^\s*stopbits ${STOPBITS}* ^\s*transport input ${TRANSPORT}* ^\s*authorization exec ${AUTHORIZATION}* ^\s*accounting connection ${ACCOUNTING_CONNECTION}* ^\s*accounting exec ${ACCOUNTING_EXEC}* ^\s*login authentication ${LOGIN_AUTHENTICATION}* ^\s*history size ${HISTORY_SIZE}* ^\s*access-class ${ACCESS_CLASS}* ^\Z -> Record
错误解析结果
[ { "ACCESS_CLASS": "", "ACCOUNTING_CONNECTION": "", "ACCOUNTING_EXEC": "", "AUTHORIZATION": "", "EXEC_TIMEOUT": "", "HISTORY_SIZE": "", "LINE_NUM": "0", "LINE_TYPE": "con", "LOGIN_AUTHENTICATION": "", "STOPBITS": "", "TRANSPORT": "" }, { "ACCESS_CLASS": "", "ACCOUNTING_CONNECTION": "", "ACCOUNTING_EXEC": "", "AUTHORIZATION": "", "EXEC_TIMEOUT": "0 0", "HISTORY_SIZE": "", "LINE_NUM": "0", "LINE_TYPE": "aux", "LOGIN_AUTHENTICATION": "autCON", "STOPBITS": "1", "TRANSPORT": "" }, { "ACCESS_CLASS": "", "ACCOUNTING_CONNECTION": "", "ACCOUNTING_EXEC": "", "AUTHORIZATION": "", "EXEC_TIMEOUT": "", "HISTORY_SIZE": "", "LINE_NUM": "0 4", "LINE_TYPE": "vty", "LOGIN_AUTHENTICATION": "autAUX", "STOPBITS": "1", "TRANSPORT": "" }, { "ACCESS_CLASS": "", "ACCOUNTING_CONNECTION": "", "ACCOUNTING_EXEC": "", "AUTHORIZATION": "", "EXEC_TIMEOUT": "1 0", "HISTORY_SIZE": "", "LINE_NUM": "5 15", "LINE_TYPE": "vty", "LOGIN_AUTHENTICATION": "autAAA", "STOPBITS": "", "TRANSPORT": "" }, { "ACCESS_CLASS": "", "ACCOUNTING_CONNECTION": "", "ACCOUNTING_EXEC": "", "AUTHORIZATION": "", "EXEC_TIMEOUT": "2 0", "HISTORY_SIZE": "", "LINE_NUM": "16", "LINE_TYPE": "vty", "LOGIN_AUTHENTICATION": "autBBB", "STOPBITS": "", "TRANSPORT": "" } ]
解决方案:修正后的TextFSM模板
核心问题是原模板遇到新line条目时未先完成上一条记录的写入,导致属性错位。调整后的模板如下:
Value Required LINE_TYPE (\S+) Value LINE_NUM (\S.*) Value EXEC_TIMEOUT (\d+ \d+) Value STOPBITS (\d+) Value LOGIN_AUTHENTICATION (\S+) Value ACCESS_CLASS (\S+.*) Start # 遇到新line时,先记录上一条(若存在),再开始新记录 ^line ${LINE_TYPE} ${LINE_NUM} -> Continue.RecordIfNotEmpty # 匹配目标属性 ^\s*exec-timeout ${EXEC_TIMEOUT} ^\s*stopbits ${STOPBITS} ^\s*login authentication ${LOGIN_AUTHENTICATION} ^\s*access-class ${ACCESS_CLASS} # 遇到分隔符!或文件结尾时,记录当前条目 ^! -> Record ^\Z -> Record
正确解析结果
修正后解析示例输出将得到准确的结构化数据:
[ { "ACCESS_CLASS": "", "EXEC_TIMEOUT": "0 0", "LINE_NUM": "0", "LINE_TYPE": "con", "LOGIN_AUTHENTICATION": "autCON", "STOPBITS": "1" }, { "ACCESS_CLASS": "", "EXEC_TIMEOUT": "", "LINE_NUM": "0", "LINE_TYPE": "aux", "LOGIN_AUTHENTICATION": "autAUX", "STOPBITS": "1" }, { "ACCESS_CLASS": "", "EXEC_TIMEOUT": "1 0", "LINE_NUM": "0 4", "LINE_TYPE": "vty", "LOGIN_AUTHENTICATION": "autAAA", "STOPBITS": "" }, { "ACCESS_CLASS": "", "EXEC_TIMEOUT": "2 0", "LINE_NUM": "5 15", "LINE_TYPE": "vty", "LOGIN_AUTHENTICATION": "autBBB", "STOPBITS": "" }, { "ACCESS_CLASS": "55 in vrf-also", "EXEC_TIMEOUT": "3 0", "LINE_NUM": "16", "LINE_TYPE": "vty", "LOGIN_AUTHENTICATION": "autCCC", "STOPBITS": "" } ]
关键调整说明
- 状态流转优化:将
Continue.Record改为Continue.RecordIfNotEmpty,确保新line出现时先写入上一条未完成的记录。 - 明确记录触发条件:添加
^! -> Record规则,遇到配置分隔符!时立即记录当前条目;保留^\Z -> Record处理文件末尾的最后一条记录。 - 精简字段规则:仅保留实际需要的字段,减少无关匹配规则对解析逻辑的干扰。
内容的提问来源于stack exchange,提问作者Juan Manuel Fernández
相关产品推荐
相关产品推荐

