【问题标题】:config from router shows as one line need multiline for ciscoconfparse来自路由器的配置显示为 ciscoconfparse 需要多行
【发布时间】:2020-06-12 20:32:01
【问题描述】:

刚接触 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']

我正在运行的代码的 sn-p。删除行语句会删除整个配置片段,而不仅仅是与 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 函数?

【问题讨论】:

    标签: python-3.x cisco-ios ciscoconfparse


    【解决方案1】:

    您将字符串而不是列表传递给 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 表示换行,但它仍然是一个字符串)。当您使用分割线时 - 它会将您的字符串传输到列表中(每一行都是一个新元素)

    【讨论】:

    • 试过了,但似乎它确实以列表的形式返回,然后我收到错误消息。这是现在生成的代码和错误。 conf=[ssh.send_command("show run | in snmp")] tConf=type(conf) print(tConf) output=conf.splitines() parse = CiscoConfParse(output) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Traceback(最近一次调用最后):文件“/Users/xxxx/parseNX1.py”,第 25 行,在 output=conf.splitines AttributeError: 'list' object has no attribute 'splitines'
    【解决方案2】:

    能够通过迭代 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 函数来生成我想要发送回我的设备的否定配置: ['10.4.233.8 社区内没有 snmp-server 主机 ***** 2c 版', '10.3.25.17 投票社区内没有 snmp-server 主机 ***** 2c 版',...]]]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-30
      • 2012-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-28
      • 2019-10-26
      • 1970-01-01
      相关资源
      最近更新 更多