Das beste Objekt für das, was Sie zu tun versuchen, ist ein Counter
(von collections
).
Der „nicht-so-Pythonic“ (aber einfacher zu lesen, wenn Sie nicht zu Python gewohnt sind) wäre Weg, dies zu schreiben:
from scapy.all import PcapReader, TCP
from collections import Counter
count = Counter()
for pkt in PcapReader("test.pcap"):
if TCP in pkt and pkt[TCP].flags & 2: # TCP SYN packet
src = pkt.sprintf('{IP:%IP.src%}{IPv6:%IPv6.src%}')
count[src] += 1
Es ist einfach, dies als ein Verständnis zu schreiben:
Dann
from scapy.all import PcapReader, TCP
from collections import Counter
count = Counter(
pkt.sprintf('{IP:%IP.src%}{IPv6:%IPv6.src%}')
for pkt in PcapReader('test.pcap')
if TCP in pkt and pkt[TCP].flags & 2
)
, ein Counter
verhält sich wie ein dict
Objekt:
>>> count["1.2.3.4"]
12
Aber ein Counter
hat eine handliche .most_common()
Methode:
>>> count.most_common(1)
[('1.2.3.4', 12)]
>>> count.most_common()
[('1.2.3.4', 12), [...]]
Als Schlussfolgerung, die ich erwähnen muß, dass scapy schlechte Leistungen, wenn es um das Parsen eine Menge von Paketen kommt (und wenn wir über Flut sprechen, das auch sein mag der Fall). Wenn ich Sie wäre, würde ich immer noch eine Counter
verwenden, aber ich würde die Quellen mit einem subprocess.Popen()
Anruf tcpdump
oder tshark
anstelle von Scapys PcapReader
generieren.
Danke. Wie kann ich eine Liste drucken mit: {IP: Nummer des SYN-Flags} sortiert nach der Nummer des SYN-Flags? –
Sie können die IP-Adresse in ein Wörterbuch als den Schlüssel und die Zählung als Wert setzen, dann sortieren – spicyramen
Ich habe versucht, aber funktioniert nicht: https://bpaste.net/show/0094b136f276 –