So verarbeiten / leiten Sie TCPDUMPs-Ausgaben in Echtzeit


27

Wenn ich DNS-Anfragen von Clients (auf einem OpenWrt 10.04-Router) tcpdumpen möchte, dann habe ich

root@ROUTER:/etc# tcpdump -n -i br-lan dst port 53 2>&1       
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on br-lan, link-type EN10MB (Ethernet), capture size 96 bytes
22:29:38.989412 IP 192.168.1.200.55919 > 192.168.1.1.53: 5697+ A? foo.org. (25)
22:29:39.538981 IP 192.168.1.200.60071 > 192.168.1.1.53: 17481+ PTR? 150.33.87.208.in-addr.arpa. (44)
^C
2 packets captured
3 packets received by filter
0 packets dropped by kernel

Das ist völlig in Ordnung. Aber. Warum kann ich die Ausgabe von tcpdumps nicht in Echtzeit leiten?

root@ROUTER:/etc# tcpdump -n -i br-lan dst port 53 2>&1 | awk '/\?/ {print $3}'
^C
root@ROUTER:/etc# 

Wenn ich nach tcpdump etwas achte, bekomme ich KEINE Ausgabe. Warum das? Warum kann ich die Ausgabe von tcpdump nicht in Echtzeit mit Pipelining verarbeiten? (so dass zB im Beispiel in nur die 3. Spalte ausgegeben wird)

Gibt es dafür irgendwelche Lösungen?

Antworten:


35

Direkt raus aus man tcpdump

-l     Make stdout line buffered.  Useful if you want to see the data while 
       capturing it.  E.g.,

              tcpdump -l | tee dat

       or

              tcpdump -l > dat & tail -f dat

       Note that on Windows,``line buffered'' means ``unbuffered'', so that 
       WinDump will write each character individually if -l is specified.

       -U is similar to -l in its behavior, but it will cause output to be 
       ``packet-buffered'', so that the output is written to stdout at the 
       end of each packet rather than at the end of each line; this is 
       buffered on all platforms, including Windows.

7

Verwenden Sie die Option -Uin Kombination mit, -wdamit tcpdump sofort Pakete schreibt.


3

Der tcpdump puffert anscheinend die Ausgabe, wenn er in eine Pipe schreibt. Es wird nicht bei jedem Schreibvorgang die Ausgabe gelöscht, daher schreibt das System die Ausgabe in etwa 4-KByte-Blöcken. Ihr Filter hat eine begrenzte Ausgabe, sodass Sie nichts sehen, bis dieser Filter genügend Ausgabe geschrieben hat. Sobald es genug gesammelt hat, wird es in einen Block geschrieben, und Sie sollten dann mehrere ausgegebene Zeilen sehen.

Versuchen Sie mehrmals, DNS-Lookups auszulösen, und sehen Sie, was dann passiert.


1

expecthat einen unbufferBefehl, um Befehle in die Annahme zu täuschen, dass sie in ein tty schreiben, damit sie nicht puffern.


1

Ich erstelle einen Echtzeitüberwachungs-Wrapper um tcpdump, der Pakete sehen muss, sobald sie verfügbar sind. Trotzdem -lgibt es eine gewisse Verzögerung.

tcpdump hat jetzt --immediate-modedas Problem für mich gelöst. Um es zum Laufen zu bringen, habe ich es in Verbindung mit verwendet -l.

Siehe diese Antwort .

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.