1

我正在编写一个脚本来从 Cisco ASA 的配置中解析防火墙规则。

我的输入示例包括:

access-list myACL line 1 extended permit tcp host 10.8.13.200 host 10.32.53.22 eq 1122
access-list myACL line 2 extended permit tcp 10.8.13.0 255.255.255.0 host 10.1.206.17 eq 445 
access-list myACL line 3 extended permit udp host 10.8.13.200 eq 54345 host 10.1.206.17 eq 445
access-list myACL line 4 extended permit icmp any any

对于上面的三行,我想要的 .csv 格式的输出如下。但是,这些也可以是要存储在数据库中的元组。

#aclName,lineNumber,action,protocol,sourceIP,sourcePort,destIP,destPort
myACL,1,permit,tcp,10.8.13.200,*,10.32.53.22,1122
myACL,2,permit,tcp,10.8.13.0/24,*,10.1.206.17,445
myACL,3,permit,udp,10.8.13.200,54345,10.1.206.17,445
myACL,4,permit,icmp,*,*,*,*

我在选择这个项目的方法时遇到了麻烦。我查看了许多选项,包括 ats、shlex,甚至只是使用正则表达式,但我很难确定最佳选项是什么。PLY 在这里有帮助吗?

什么是合适的方法?

4

3 回答 3

0

如果只需要输出 CSV 目标,我建议您使用最熟悉的方法。如果这是一次性/临时的事情,我进一步推荐任何能让你最快完成它的方法。

如果是我——我可能会使用正则表达式。

于 2012-04-17T18:51:19.490 回答
0

我会解析防火墙字符串.split(" ")

于 2012-04-17T18:55:17.727 回答
0

前 6 个字段似乎是相当可预测的,这使得端点可以有多种表示形式。一种可能性是(未经测试的代码,但我希望你明白):

parts = rule.split(" ")
aclName, _, lineNumber, _, action, protocol = parts[:6]
endpoints = parts[6:]

def get_endpoint(eps):
    host, port = "*", "*"
    if eps[0] == "host":
        host = eps[1]
        eps = eps[2:]
    elif eps[0] == "any":
        eps = eps[1:]
    else:
        host = eps[0] + "/" + mask_to_bits(eps[1])
        eps = eps[2:]

    if eps and eps[0] == 'eq':
        port = eps[1]
        eps = eps[2:]
    return host, port, eps

sourceIP, sourcePort, endpoints = get_endpoint(endpoints)
destIP, destPort, endpoints = get_endpoint(endpoints)
于 2012-04-17T19:06:12.620 回答