首页 > 编程问答 >使用 TextFSM 解析 CISCO 的 con/aux/vty 配置

使用 TextFSM 解析 CISCO 的 con/aux/vty 配置

时间:2024-07-22 15:12:56浏览次数:12  
标签:python parsing cisco python-textfsm ciscoconfparse

我正在尝试使用 TextFSM 从 Cisco 路由器解析控制台 (con/aux/vty) 的配置,特别是命令 show running-config | 的输出。部分线。出现此问题的原因是,这部分配置并未像往常一样以“!”结束“line vtys”,这会在尝试检测记录的结尾而不错过该行作为下一条记录的开头时出现问题。

我期望以结构化格式提取以下数据:

"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
!

我测试了以下模板(在数百个其他试验中!),但它未对齐。这可以在我最后附加的结果的 LINE_TYPE 和 LOGIN_AUTHENTICATION 行中观察到:

TextFSM File

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

Result

[
    {
        "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 默认情况下会逐行解析,而你的配置行并非总是在同一个记录块中。 因此,你需要调整模板以更好地处理跨越多行的配置块。

以下是一种改进后的 TextFSM 模板,可以正确解析你的配置:

Value Required LINE_TYPE (\S+)
Value LINE_NUM (\S.*)
Value EXEC_TIMEOUT (\d+ \d+|\S+)
Value STOPBITS (\d+)
Value LOGIN_AUTHENTICATION (\S+)
Value ACCESS_CLASS (\S+.*)

Start
  ^line ${LINE_TYPE} ${LINE_NUM} -> Record Start

Record Start
  ^\s*exec-timeout ${EXEC_TIMEOUT}*
  ^\s*stopbits ${STOPBITS}*
  ^\s*login authentication ${LOGIN_AUTHENTICATION}*
  ^\s*access-class ${ACCESS_CLASS}*
  ^line|^\Z -> Record Stop

Record Stop

改进说明:

  • Record Start Record Stop 状态: 引入了新的状态来定义每个记录的开始和结束。
  • Record Start 状态会在匹配到 line ... 行后激活,并开始收集该记录的数据。
  • Record Stop 状态会在遇到新的 line ... 行(表示新记录开始)或到达文件末尾 ( \Z ) 时激活,并将收集到的数据保存为一条记录。
  • 正则表达式调整: 部分正则表达式进行了微调,以更好地匹配数据并提高解析的准确性。

使用此模板,你应该能够正确解析 Cisco 路由器的控制台配置,即使配置行跨越多行。

标签:python,parsing,cisco,python-textfsm,ciscoconfparse
From: 77363853

相关文章

  • Python 实现Excel和TXT文本格式之间的相互转换
    Excel是一种具有强大的数据处理和图表制作功能的电子表格文件,而TXT则是一种简单通用、易于编辑的纯文本文件。将Excel转换为TXT可以帮助我们将复杂的数据表格以文本的形式保存,方便其他程序读取和处理。而将TXT转换为Excel则可以将文本文件中的数据导入到Excel中进行进一步的分析和......
  • Python (Django) 数据操作
    “如何将Excel考勤数据转换为特定的数据库插入格式?”**我Excel中的数据如下所示:**这是数据格式I**需要将其转换为适合数据库插入的格式,如下所示:**我想要的数据将Excel考勤数据转换为特定数据库插入格式的Python......
  • 在 python 中表示矩阵等价类的好方法是什么?
    我正在尝试编写一个程序来对井字棋进行强化学习。我希望引擎认识到,如果您反射棋盘或旋转它,您会得到完全相同的游戏,因此这些棋盘应该被视为彼此相同。目前我有一本字典,代表我当前对每个棋盘的估计估值游戏中的棋盘,每次游戏结束时,该游戏期间发生的所有棋盘位置的估值都会根据它......
  • MIT自学---python---6.100A_lecture2
    MIT自学---python---6.100A_lecture2前言一、设置python编译器地址二、将运行python文件的命令简化三、终端尝试执行简单python命令四、今日学到的python命令个人总结前言  这两天去听讲座,没什么时间按照计划自学MIT,今天赶紧补上。今天主要任务是搭建vscodepython......
  • python pip 需要构建工具,而它已经安装
    我看到这个问题已经被发布了很多次,人们设法解决了这个问题,但我没有!!操作系统版本:Windows1021H1Build19043.1288Python版本:Python3.9.7(tags/v3.9.7:1016ef3,Aug302021,20:19:38)[MSCv.192964bit(AMD64)]onwin32Pip、wheel和setuptool都可以日期:......
  • 无法在浏览器中访问Python 127.0.0.1:8000上的本地主机
    fromdjango.contribimportadminfromdjango.urlsimportpath,includeurlpatterns=[path('admin/',admin.site.urls),path('products/'),include('products.urls')#thisline]嗨,任何人。很抱歉问这样的问题,但这是我第一次尝试python。......
  • 在 VSCode 中通过 Python 使用 YouTube API 时如何启用 Intellisense
    我想在使用GoogleYouTubeAPI和Python时在VSCode中获得IntelliSense。但我不知道详细步骤。fromgoogleapiclient.discoveryimportbuildapi_key="****"youtube=build("youtube","v3",developerKey=api_key)request=youtube.channels().list(part......
  • 当 python 脚本通过 jenkins + Github 在 Windows 本地计算机上运行时,chrome 浏览器不
    我的Python代码是(windowsMachine)fromseleniumimportwebdriverprint("newLine")print("2Line")print("3Line")holdChrome=webdriver.ChromeOptions()holdChrome.add_experimental_option("detach",True)#Restricta......
  • python_基础_数据类型
    基础数据类型不需要声明,只有被赋值后才会创建变量。变量本身没有类型,“类型”指的是所存值的类型。类型判断type(x)和isinstance(x,int)前者不会认为子类是一种他的父类类型后者会认为子类是父类类型>>>classA:...pass...>>>classB(A):...pass......
  • IPython 使用技巧
    IPython是一个强大的交互式Pythonshell,提供了许多方便的功能,使Python编程更加高效和愉快。本文将介绍一些IPython的实用技巧,帮助开发者充分利用其功能,提高编程效率。1.基本操作和快捷键1.1启动IPython可以通过在终端输入以下命令来启动IPython:ipython启动后,你......