1

网络人是 Python 和编程新手,发现这个 ciscoconfparse 库看起来有一些非常有用的特性。我遇到了一个问题,我确定这是一些基本的问题,但还没有弄清楚。我正在尝试从路由器中提取 snmp 配置以创建配置集以删除 v2 配置。使用 netmiko 获取“show run | in snmp”的输出,然后解析它。返回的配置显示为一行。当使用 ciscoconfparse 语句删除一些行时,它会删除所有内容(假设因为它只有一行),所以我没有什么要构建的了。

在所有在线示例中,示例配置看起来像这样,并且功能工作因为它是多行的。

conf=[
        'access-list dmz_inbound extended deny udp object training-network any4 eq snmp',
        'snmp-server host inside 10.10.10.10 poll community ***** version 2c',
        'snmp-server host inside 10.20.20.20 poll community ***** version 2c',
        'no snmp-server location',
        'no snmp-server contact',
        'snmp-server community *****',
        '!'
        ]

当我实际从路由器中提取配置时,它看起来像这样带有换行符,但被解析为 1 行:

'access-list testNada extended permit udp host 10.10.10.10 eq snmp host 10.20.10.10 eq snmp \nsnmp-server host inside 10.11.11.11 community ***** version 2c\nsnmp-server host inside 10.5.5.5 poll community ***** version 2c\nno snmp-server location\nno snmp-server contact\nsnmp-server community *****\n']

我正在运行的代码片段。删除行语句删除整个配置片段,而不仅仅是与 arg 匹配的行。


    conf = [ssh.send_command("show run | include snmp")]
    parse = CiscoConfParse(conf)
    parse.delete_lines('no snmp-server')
    parse.delete_lines('access-list')
    newConf = (parse.replace_lines('snmp', 'no snmp',excludespec='v3'))

    ssh.send_config_set(newConf)

如何直接从路由器中提取配置以显示为多行,以便我可以使用 ciscoconfparse 函数?

4

2 回答 2

0

您将字符串而不是列表传递给 CiscoConfParse。

试试下面的:

conf = [ssh.send_command("show run | include snmp")]

# this will change your string into a list
formatted_output = conf.splitlines() 

parse = CiscoConfParse(formatted_output)
parse.delete_lines('no snmp-server')
parse.delete_lines('access-list')
newConf = (parse.replace_lines('snmp', 'no snmp',excludespec='v3'))

解释:Netmiko 将返回一个字符串(/n 表示换行,但它仍然是一个字符串)。当您使用分割线时 - 它会将您的字符串传输到列表中(每一行都是一个新元素)

于 2020-06-12T22:07:51.077 回答
0

能够通过迭代 netmiko 返回的列表来使其工作,该列表返回一个“列表中的列表”。基本上它是一个列表,其中有一个索引恰好是包含配置的列表。

newConf=[]
for i in conf:
    newConf.append(i.split("\n"))

它返回 [['access-list testNada extended permit udp host 10.10.3.10 eq snmp host 10.10.10.10 eq snmp', 'snmp-server host inside 10.4.233.8 community ***** version 2c', ....] ]

然后通过解析器运行它以获取索引 0。

parse = CiscoConfParse(newConf[0])

这导致多行,我可以使用 delete_lines 和 replace_lines 函数来生成我想要发送回我的设备的否定配置:['no snmp-server host inside 10.4.233.8 community ***** version 2c',' 10.3.25.17 投票社区内没有 snmp-server 主机 ***** 版本 2c',...]]

于 2020-06-17T12:54:59.090 回答