我正在尝试编写一个脚本,通过 SSH 从 Cisco 路由器提取配置文件并对其进行解析,这样我就可以确保它们符合预定义的标准(例如,密码不应该是“cisco”)。
连接到路由器并以编程方式运行命令很简单。我遇到的障碍是运行show running config
会返回全局配置设置以及特定接口的设置。
我的目标是以不同于全局设置的方式处理接口设置;例如,我可以忽略已禁用接口上的错误设置。
是否有单独的命令用于获取全局设置和获取接口定义(例如show global settings
和show interface settings
命令类型)?或者,是否有更好的方法可以检索此信息,使其更容易解析?
答案1
自动 Cisco IOS 配置解析
或者,有没有更好的方法来检索这些信息以使其更容易解析?
由于 IOS 配置的层次结构,解析路由器/交换机配置非常复杂;尽可能使用专门为您解析的工具。其中一个工具是ciscoconfparse(文档是这里) 注1 .ciscoconfparse拥有一整套单元测试,确保工具不同版本之间的解析保持一致。
假设配置如下精确格式由 Cisco IOS 使用,show running-config
或者show startup-config
ciscoconfparse自动为您找到接口级配置。这意味着您可以自动实现接口和全局配置的标准化……这是一个交换机接口配置审计示例在文档中。 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
由于格式中包含上下文,因此您应该考虑根据上下文进行解析。您可能需要编写更多代码才能做到这一点。考虑为您的代码使用一个模型,该模型为全局状态、接口等构建一个对象模型。
从操作上来说,如果有人启用禁用的接口,从禁用的接口中删除不兼容的设置可能是一个好主意。