Come elaborare / reindirizzare l'output dei TCPDUMP in tempo reale


27

Se voglio tcpdump richieste DNS da parte dei client (su un router OpenWrt 10.04), allora io

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

Va tutto bene. Ma. Perché non riesco a convogliare l'output di tcpdumps in tempo reale?

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

Se mi sveglio, ecc. Qualcosa dopo tcpdump, non ottengo NESSUN output. Perché? Perché non riesco a elaborare l'output di tcpdump con pipelining in tempo reale? (in modo che ad esempio: nell'esempio restituisca solo la 3a colonna)

Ci sono soluzioni per questo?

Risposte:


35

Direttamente da 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

Utilizzare l'opzione -Uin combinazione con in -wmodo che tcpdump scriva immediatamente i pacchetti.


3

Apparentemente tcpdump esegue il buffering dell'output quando scrive su una pipe. Non sta scaricando l'output per ogni scrittura, quindi il sistema scriverà l'output in blocchi di circa 4k byte. Il tuo filtro è limitato, quindi non vedrai nulla fino a quando quel filtro non avrà scritto abbastanza output. Una volta che ha raccolto abbastanza, verrà scritto in un pezzo e dovresti vedere diverse righe emesse allora.

Prova ad attivare le ricerche DNS molte volte e vedi cosa succede dopo.


1

expectha un unbuffercomando per ingannare i comandi nel presupporre che stiano scrivendo su un tty, quindi non bufferizzano.


1

Sto creando un wrapper di monitoraggio in tempo reale attorno a tcpdump che deve vedere i pacchetti non appena sono disponibili. Anche con -lqualche ritardo.

tcpdump ora ha --immediate-moderisolto questo problema per me. Per farlo funzionare l'ho usato insieme a -l.

Vedere questa risposta .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.