以可解析的方式从 Cisco 路由器检索信息

ahj*_*n25 5 automation cisco configuration

我正在尝试编写一个脚本,该脚本将通过 SSH 从 Cisco 路由器中提取配置文件并对其进行解析,因此我可以确保它们符合预定义的标准(例如,密码不应为“cisco”)。

以编程方式连接到路由器和运行命令很简单。我遇到的障碍是运行会show running config返回全局配置设置以及特定接口的设置。

我的目标是以不同于全局设置的方式处理接口设置;例如,我可以忽略禁用的接口上的错误设置。

是否有用于获取全局设置和获取接口定义的单独命令(例如show global settings和一种show interface settings命令类型)?或者,有没有更好的方法可以检索这些信息,以便更容易解析?

Thi*_*his 4

自动 Cisco IOS 配置解析

或者,是否有更好的方法可以检索此信息,使其更易于解析?

由于 IOS 配置中的层次结构,解析路由器/交换机配置相当复杂;只要有可能,请使用专门为您解析的工具。其中一种工具是ciscoconfparse(文档位于此处注 1ciscoconfparse具有一整套单元测试,可确保工具版本之间的解析保持一致。

假设配置与 Cisco IOS 使用的格式完全相同show running-configciscoconfparseshow startup-config会自动为您查找接口级配置。这意味着您可以自动化接口和全局配置的标准化...这是文档中的 交换机接口配置审核示例。ciscoconfparse有很多功能;您应该花一些时间阅读文档。

还有一些专门的方法可以为你做很多具体的值解析;这些方法目前处于测试阶段 - 并且仅在源代码中可见......例如假设您有一个保存为的开关配置c6509.conf

!
interface GigabitEthernet2/8
 ip address 192.0.2.1 255.255.255.252
 mtu 9000
 carrier-delay msec 50
!
Run Code Online (Sandbox Code Playgroud)

您可以使用脚本或python 解释器来检索 IP 地址并carrier-delay以本机 python 表示形式...

[mpenning@tsunami ~]$ python
Python 2.7.3 (default, Jan  2 2013, 13:56:14)
[GCC 4.7.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>> from ciscoconfparse import CiscoConfParse
>>> config = CiscoConfParse('c6509.conf', factory=True)
>>>
>>> intfs = config.find_objects('interface GigabitEthernet2/8', exactmatch=True)
>>> intfs
[<IOSIntfLine # 1 'GigabitEthernet2/8' info: '192.0.2.1/30'>]
>>>
>>> intfs[0].ip_addr
'192.0.2.1'
>>>
>>> intfs[0].has_manual_carrierdelay
True
>>>
>>> intfs[0].manual_carrierdelay
0.05
>>>
>>> intfs[0].manual_mtu
9000
>>>
Run Code Online (Sandbox Code Playgroud)

如果您想要测试版功能,您需要使用 解析配置factory=True,如上所示...


本机 Cisco IOS 解析功能

我的目标是以不同于全局设置的方式处理界面设置;例如,我可以忽略已禁用的接口上的错误设置。

是否有单独的命令用于获取全局设置和获取接口定义(例如,显示全局设置和显示接口设置类型的命令)?

IOS 允许您查看单独的接口级配置,但是当您可能有数百个接口时,这是非常痛苦的...想象一下为每个接口运行此命令...

CORE01.PUB.DAL02#sh runn int gi1/2
Building configuration...

Current configuration : 242 bytes
!
interface GigabitEthernet1/2
 description Link to edge01.pub.dal02
 ip address 192.0.2.46 255.255.255.252
 ip ospf network point-to-point
 media-type rj45
end

CORE01.PUB.DAL02#
Run Code Online (Sandbox Code Playgroud)

根据您运行的映像,Cisco IOS 允许一些其他全局配置部分...这是来自运行 12.4 的路由器...

EDGE01.PUB.DEN#sh running-config ?
  brief       configuration without certificate data
  class-map   Show class-map information
  full        full configuration
  interface   Show interface configuration
  linenum     Display line numbers in output
  map-class   Show map class information
  policy-map  Show policy-map information
  view        View options
  |           Output modifiers
  <cr>

EDGE01.PUB.DEN#
Run Code Online (Sandbox Code Playgroud)

还可以使用 IOS 正则表达式从 CLI 获取全局配置的一部分...例如...

EDGE01.PUB.DEN#show runn | include ^enable
enable secret 5 $1$mOmQ$sORLRqZQZ/cr7KSyrXUPZ.
EDGE01.PUB.DEN#
Run Code Online (Sandbox Code Playgroud)

仅供参考,这是“cisco”启用密码的 MD5 哈希值,如果在生产中找到,您需要对其进行标记...


回复此评论

有没有好的方法来定义接口定义何时结束?似乎所有接口行都缩进一个空格,但我不确定这是否是跨配置的标准

是的,Cisco IOS 总是将子配置元素缩进一个额外的空格...无论子配置元素是否是接口配置语句、IP 扩展 ACL 行等...


尾注

注 1 Stack Exchange 免责声明:我是作者。