-2

我正在使用 [rt] 并希望创建一个操作来解析一系列防火墙规则,并将其中的 IP 地址作为逗号分隔值应用于字段。我的防火墙规则如下所示:

access-list ACL-outside-1net extended permit tcp host 172.16.0.7 host 10.0.1.55 eq www
access-list ACL-outside-1net extended permit tcp host 172.16.0.9 host 10.0.1.56 eq www

如果我可以有一个正则表达式,它将捕获“主机”之后发生的任何内容并将它们作为逗号分隔的字符串返回,而不会在行尾之前拾取所有内容,这将是我当前的失败点。

即我的正则表达式的理想输出是:

172.16.0.7,10.0.1.55,172.16.0.9,10.0.1.56

我感兴趣的规则总是eq $service or $port以 IP 地址开头host,但是 IP 地址可以是 ipv4 或 ipv6 并且 [rt] 会很聪明地解析地址,所以我宁愿选择“在主机之后” up to host”和“after host up to eq”,但我很难让正则表达式匹配,更不用说替换成逗号分隔的字符串了。

小帮助?

编辑 201305080832

我被要求(并且适当地反对​​)分享我的工作,所以这是我正在为 [rt] 工作的模板。

IPs|Body|host(.*)||

我的自定义字段被命名IPs,我正在Body搜索“主机”,然后一直在进行贪婪匹配,这不是Multi-value IP address[rt] 中的字段可接受的 IP 地址。如果我从使用模板更改ExtractCustomFieldValue为为此用例编写特定的脚本操作,则以下建议可能是可行的。


[rt]请求跟踪器

4

2 回答 2

0
use strict;
use warnings;

my $s="access-list ACL-outside-1net extended permit tcp host 172.16.0.7 host 10.0.1.55 eq www";

if ($s =~ /host(.*) host(.*) eq.*/)
{
    print "$1\n$2\n";
}

使用括号进行分组提取。第一组$1的元素进入,第二组的元素进入“$2”。.* 将获取除换行符以外的所有字符。祝你好运。

编辑:更准确地说,你可以使用这个:

if ($s =~ /host((?:[0-9]|.)+) host((?:[0-9]|.)+) eq.*/)
    {
        print "$1\n$2\n";
    }

(?:..) 表示分组,而不是提取。[0-9]|。表示您要求所有字符为 0-9 或 .

要在一行上打印出所有内容,只需编写一个循环来遍历所有行并使用逗号而不是 \n 来分隔它们。

于 2013-05-08T02:49:35.990 回答
0

也许以下内容会有所帮助:

use strict;
use warnings;
use Regexp::Common qw/net/;

my ( @IPs, @ips );
while (<DATA>) {
    push @IPs, @ips if @ips = /($RE{net}{IPv4})/g;
}

print join ',', @IPs;

__DATA__
access-list ACL-outside-1net extended permit tcp host 172.16.0.7 host 10.0.1.55 eq www
access-list ACL-outside-1net extended permit tcp host 172.16.0.9 host 10.0.1.56 eq www

输出:

172.16.0.7,10.0.1.55,172.16.0.9,10.0.1.56

这使用模块Regexp::Common来捕获每一行上的 IP,并且这些 IP 被push编辑到@IPs并在被print编辑后被join编辑为 ','。

于 2013-05-08T03:25:37.577 回答