以可分辨方式从思科路由器获取信息

我试图编写一个脚本,通过SSH从思科路由器提取configuration文件并parsing它们,这样我就可以确保它们符合预定义的标准(例如,密码不应该是“cisco”)。

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

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

是否有单独的命令获取全局设置和获取接口定义(例如show global settingsshow interface settingstypes的命令)? 另外,有没有更好的方法,我可以检索这些信息,这将更容易parsing?

自动化的Cisco IOSconfigurationparsing

另外,有没有更好的方法,我可以检索这些信息,这将更容易parsing?

由于IOSconfiguration中层次结构的层次,parsing路由器/交换机configuration相当复杂; 只要有可能,请使用专门为您parsing的工具。 一个这样的工具是ciscoconfparse (文档在这里 ) 注1 。 ciscoconfparse有一整套unit testing,确保parsing工具版本之间保持一致。

假设configuration采用Cisco IOS show running-configshow startup-config使用的确切格式 , ciscoconfparse会自动为您find接口级configuration。 这意味着您可以自动化接口和全局configuration的标准化…这是文档中的交换机接口configuration审计示例 。 ciscoconfparse有很多function, 你应该花一些时间阅读文档。

也有一些专门的方法为您做了很多具体的价值parsing; 这些方法目前处于testing阶段 – 只能在源代码中看到…例如,假设您将交换机configuration另存为c6509.conf

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

您可以使用脚本或python解释器来检索原生Python表示中的IP地址和carrier-delay

 [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 >>> 

如果你想要betafunction,你需要用factory=True来parsingconfig,如上所示…


本地思科IOS分析function

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

是否有单独的命令获取全局设置和获取接口定义(例如显示全局设置和show interface设置types的命令)?

IOS可以让你看到各个接口级别的configuration,但是当你有数百个接口的时候,这是非常痛苦的…想象一下,为每个接口运行这个命令…

 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允许一些其他全局configuration部分…这是从路由器运行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正则expression式获取全局configuration的一部分…例如…

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

仅供参考,这是一个启用密码“cisco”,你想标志,如果在生产中find一个MD5哈希…


回应这个评论 :

有什么好的方法来定义接口定义何时结束? 看来,所有的界面行缩进一个空格,但我不知道,如果这是标准的configuration

是的,Cisco IOS总是将子configuration元素缩进一个额外的空间,不pipe这个子节点是一个接口configuration语句,IP扩展ACL线路等等。


结束笔记

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

由于格式中有上下文,因此应该考虑对其进行上下文parsing。 你可能需要编写更多的代码来做到这一点。 考虑为你的代码使用一个模型,为全局状态,接口等构造一个对象模型。

在操作上,从禁用的接口中删除不兼容的设置可能是一个好主意,以防有人启用它们。