Python正则表达式 - 从tcpdump中解析端口

1 投票
3 回答
2072 浏览
提问于 2025-04-18 17:31

我正在尝试解析运行“tcpdump -nNqt”时给出的信息。

示例输出看起来像这样:

IP 10.0.0.11.60446 > 10.0.0.232.22: tcp 0
IP 10.0.0.232.22 > 10.0.0.11.60446: tcp 176
IP 10.0.0.232.22 > 10.0.0.11.60446: tcp 80

到目前为止,我已经能够提取出:

第一个IP / 第二个IP

(?<=IP\s)\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b
(?<=\s>\s)\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b

TCP或UDP / 大小

(?<=:\s)(.{1,3})
(?<=tcp |udp )(\d+)

但是我还没有办法提取出端口号,端口号是IP最后的几个数字。我的尝试没有成功,代码如下:

(?<=\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\.)\d{,6}

我的表达式有什么问题?有没有其他我没有想到的方法可以做到这一点?

3 个回答

0

试试这个正则表达式

/^.*?(\d+\.\d+\.\d+\.\d+).*?(\d+\.\d+\.\d+\.\d+).*?([a-z]+)\s(\d+)$/g   

演示链接

0

为什么不直接用一个正则表达式解析整个内容呢?通过使用分组,你仍然可以把不同的部分分开。例如:

import re

regex_string = r'IP (?P<first_ip>\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}.\d+) > (?P<second_ip>\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}.\d+): (?P<protocol>tcp|udp) (?P<port_num>\d{1,5})'
ip_regex = re.compile(regex_string)

#info contains the output of tcpdump
for match in ip_regex.finditer(info):
    print(match.group("first_ip"))
    print(match.group("second_ip"))
    print(match.group("protocol"))
    print(match.group("port_num"))

这里有一个很棒的网站,可以用来测试正则表达式,如果你需要的话。

2

我不太明白你为什么要一个一个地提取你需要的部分。其实你可以一次性把它们都提取出来(我也稍微简化了一下你的IP模式):

IP (?P<IP1>(?:\d{1,3}\.){3}\d{1,3})\.(?P<Port1>\d+) > (?P<IP2>(?:\d{1,3}\.){3}\d{1,3})\.(?P<Port2>\d+): (?:tc|ud)p (?P<protocol>\d+)

regex101演示

import re

reg = re.compile(r"IP (?P<IP1>(?:\d{1,3}\.){3}\d{1,3})\.(?P<Port1>\d+) > (?P<IP2>(?:\d{1,3}\.){3}\d{1,3})\.(?P<Port2>\d+): (?:tc|ud)p (?P<size>\d+)")

for line in input_lines:
    m = reg.match(line)
    print(m.group("IP1"))
    print(m.group("Port1"))
    print(m.group("IP2"))
    print(m.group("Port2"))
    print(m.group("size"))

撰写回答