2013-01-22 4 views
1

Я хотел бы сохранить вывод команды tshark в переменной.Как сохранить статистику tshark в переменных

Например, если я бегу:

tshark -r capture.pcap -qz io,stat,0 

я получаю:

Time   |frames| bytes 

00.000-060.000  742  51660 

Я хочу, чтобы сохранить общее количество кадров в переменной в моем сценарии для дальнейших расчетов.

ответ

1

Сначала сохраните вывод в файл:

Либо запустив эту команду в оболочке:

tshark -r capture.pcap -qz io,stat,0 > abc.txt:

Или использовать subprocess.Popen():

from subprocess import Popen 

with open("abc.txt","w") as f: 
    Popen(["tshark" ,"-r","capture.pcap","-qz", "io,stat,0"],stdout=f) 

Теперь откройте файл и вычислить общее количество кадров:

with open("abc.txt") as f: 
    next(f) #skip header 
    tot_frames=sum(int(line.split()[1]) for line in f if line.strip()) 
    print (tot_frames)   #prints 742 
1

В моей системе формат вывода 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) 
+0

Я думаю, что первое решение лучше так, чтобы я хотите узнать количество полученных пакетов от каждого источника. Таким образом, команда будет: «tshark -r capture.pcap -qz 'io, stat, 0, ip.src == 192.168.230.146». В этом случае мне нужно проанализировать вывод, как и вы. Может ли scapy фильтровать на основе src или dst? – samaneh

+0

есть. 'count = len (a.filter (lambda pkt: pkt ['IP']. src == '192.168.230.146'))' – jfs

+0

@samaneh: вы можете комбинировать загрузку и фильтрацию: 'count = len (sniff (offline) = 'capture.pcap', lfilter = lambda p: p [IP] .src == '192.168.230.146')) ', добавьте' из scapy.all import IP, sniff' перед ним. – jfs