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

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

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

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

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

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

答案1

自动 Cisco IOS 配置解析

或者,有没有更好的方法来检索这些信息以使其更容易解析?

由于 IOS 配置的层次结构,解析路由器/交换机配置非常复杂;尽可能使用专门为您解析的工具。其中一个工具是ciscoconfparse(文档是这里) 注1 .ciscoconfparse拥有一整套单元测试,确保工具不同版本之间的解析保持一致。

假设配置如下精确格式由 Cisco IOS 使用,show running-config或者show startup-configciscoconfparse自动为您找到接口级配置。这意味着您可以自动实现接口和全局配置的标准化……这是一个交换机接口配置审计示例在文档中。 ciscoconfparse它具有很多功能;您应该花一些时间阅读其文档。

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

!
interface GigabitEthernet2/8
 ip address 192.0.2.1 255.255.255.252
 mtu 9000
 carrier-delay msec 50
!

您可以使用脚本或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
>>>

如果您想要测试版功能,则需要使用 解析配置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#

根据您正在运行的图像,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#

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

EDGE01.PUB.DEN#show runn | include ^enable
enable secret 5 $1$mOmQ$sORLRqZQZ/cr7KSyrXUPZ.
EDGE01.PUB.DEN#

仅供参考,这是“cisco”启用密码的 MD5 哈希值,如果在生产中发现它,您需要标记它......


响应此评论

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

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


结束语

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

答案2

由于格式中包含上下文,因此您应该考虑根据上下文进行解析。您可能需要编写更多代码才能做到这一点。考虑为您的代码使用一个模型,该模型为全局状态、接口等构建一个对象模型。

从操作上来说,如果有人启用禁用的接口,从禁用的接口中删除不兼容的设置可能是一个好主意。

相关内容