В моей системе формат вывода tshark
отличается от того, который вы указали в вопросе. Чтобы сделать разборе более надежным, я изменил параметры командной строки:
#!/usr/bin/env python
import shlex
from itertools import dropwhile
from subprocess import check_output as qx
# get tshark output
command = "tshark -r capture.pcap -qz 'io,stat,0,COUNT(frame)frame'"
lines = qx(shlex.split(command)).splitlines()
# parse output
lines = dropwhile(lambda line: not line.rstrip().endswith("COUNT"), lines)
next(lines) # skip header
frames_count = int(next(lines).split()[1])
print(frames_count)
Вам не нужно звонить tshark
, чтобы получить статистику из файла PCAP. Вы можете использовать библиотеку Python, который может анализировать PCAP файлы например, с помощью scapy
:
#!/usr/bin/env python
from scapy.all import rdpcap
a = rdpcap('capture.pcap')
frames_count = len(a)
print(frames_count)
Чтобы рассчитывать на tshark -r capture.pcap -qz 'io,stat,0,ip.src==192.168.230.146'
команду, используя scapy
:
#!/usr/bin/env python
from scapy.all import IP, sniff
a = sniff(offline='capture.pcap',
lfilter=lambda p: IP in p and p[IP].src == '192.168.230.146')
count = len(a)
print(count)
Я думаю, что первое решение лучше так, чтобы я хотите узнать количество полученных пакетов от каждого источника. Таким образом, команда будет: «tshark -r capture.pcap -qz 'io, stat, 0, ip.src == 192.168.230.146». В этом случае мне нужно проанализировать вывод, как и вы. Может ли scapy фильтровать на основе src или dst? – samaneh
есть. 'count = len (a.filter (lambda pkt: pkt ['IP']. src == '192.168.230.146'))' – jfs
@samaneh: вы можете комбинировать загрузку и фильтрацию: 'count = len (sniff (offline) = 'capture.pcap', lfilter = lambda p: p [IP] .src == '192.168.230.146')) ', добавьте' из scapy.all import IP, sniff' перед ним. – jfs