You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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": ""
    }
]

关键调整说明

  1. 状态流转优化:将Continue.Record改为Continue.RecordIfNotEmpty,确保新line出现时先写入上一条未完成的记录。
  2. 明确记录触发条件:添加^! -> Record规则,遇到配置分隔符!时立即记录当前条目;保留^\Z -> Record处理文件末尾的最后一条记录。
  3. 精简字段规则:仅保留实际需要的字段,减少无关匹配规则对解析逻辑的干扰。

内容的提问来源于stack exchange,提问作者Juan Manuel Fernández

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 23:27:27