как я могу проанализировать файл tcpdump с помощью python

У меня есть файл tcpdump, который я хотел бы проанализировать. Файл tcpdump выглядит так:

23:31:54.380799 IP 192.140.3.20.38373 > 240.240.255.250.8082: UDP, length 542

Я хочу проанализировать файл, чтобы получить исходный ip, IP-адрес назначения и общий размер пакета и сохранить его в списке.

Как я могу заставить вывод выглядеть примерно так:

[192.140.3.20.38,240.240.255.250.80,542]

python,parsing,tcp,tcpdump,

0

Ответов: 3


0

Вы можете достичь этого с помощью регулярного выражения. Попробуйте ниже

#Take the value in a string
string = """23:31:54.380799 IP 192.140.3.20.38373 > 240.240.255.250.8082: UDP, length 542"""

#import regular expression module
import re



#Retrieve source and destination ip
output = re.findall(r"d{1,3}.d{1,3}.d{1,3}.d{1,3}", string)

#packet size
output.append(re.sub(r'.*length(.*)',r'1',string))

#required info is in output


print output

0

pyparsing часто упускается из виду как способ написания парсеров, которые могут быть хорошо читаемыми - быстро.

В этом случае timeпредставляет собой грамматический элемент в начале каждой строки tcpdump. addressпредставляет каждый из TCP-адресов. pp.Literalиспользуется по-разному для представления таких частиц, как, например, «IP» и «>». Я использовал suppressметод, чтобы опустить элементы, которые не нужны из вывода.

Файл, который я обработал, - это ваша строка, повторяемая примерно десять раз, причем только конечная константа увеличивается в каждой строке.

>>> import pyparsing as pp
>>> time = pp.Word(pp.nums + '.:')
>>> address = pp.Word(pp.nums + '.')
>>> line = time.suppress() + pp.Literal('IP').suppress() + address + pp.Literal('>').suppress() + address + pp.Literal(':').suppress() + pp.Literal('UDP,').suppress() + pp.Literal('length').suppress() + pp.Word(pp.nums)
>>> with open('temp.txt') as lines:
...     for a_line in lines:
...         print (line.parseString(a_line).asList())
...         
['192.140.3.20.38373', '240.240.255.250.8082', '542']
['192.140.3.20.38373', '240.240.255.250.8082', '543']
['192.140.3.20.38373', '240.240.255.250.8082', '544']
['192.140.3.20.38373', '240.240.255.250.8082', '545']
['192.140.3.20.38373', '240.240.255.250.8082', '546']
['192.140.3.20.38373', '240.240.255.250.8082', '547']
['192.140.3.20.38373', '240.240.255.250.8082', '548']
['192.140.3.20.38373', '240.240.255.250.8082', '549']
['192.140.3.20.38373', '240.240.255.250.8082', '550']

0

Это может быть достигнуто с помощью регулярного выражения:

import re
data = "23:31:54.380799 IP 192.140.3.20.38373 > 240.240.255.250.8082: UDP, length 542
" * 2
print(re.findall(r"[^ ]* IP (d{1,3}.d{1,3}.d{1,3}.d{1,3}).d+ > (d{1,3}.d{1,3}.d{1,3}.d{1,3}).d+:.*, length (d+)", data))

Вывод:

[('192.140.3.20', '240.240.255.250', '542'),
 ('192.140.3.20', '240.240.255.250', '542')]

(Я сделал вывод соответствия описанию, а не точно соответствует вашему примеру, который я не понял полностью).

питон, синтаксический, ТСР, ТСРйитр,
Похожие вопросы