Comment traiter / diriger la sortie TCPDUMP en temps réel

27

Si je veux tcpdump les requêtes DNS par les clients (sur un routeur OpenWrt 10.04), alors je

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

C'est tout à fait correct. Mais. Pourquoi ne puis-je pas diriger la sortie tcpdumps en temps réel?

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

Si je awk, etc. quelque chose après tcpdump, je n'obtiens AUCUNE sortie. Pourquoi donc? Pourquoi ne puis-je pas traiter la sortie de tcpdump avec pipelining en temps réel? (de sorte que par exemple: dans l'exemple en ne sort que la 3ème colonne)

Y a-t-il des solutions pour cela?

LanceBaynes
la source

Réponses:

35

Tout droit sorti de 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.
Marcin
la source
7

Utilisez l'option -Uen combinaison avec -wafin que tcpdump écrive immédiatement les paquets.

Julius Junghans
la source
3

Le tcpdump est apparemment en train de tamponner la sortie quand il écrit dans un tube. Ce n'est pas le vidage de la sortie pour chaque écriture, donc le système écrit la sortie en morceaux d'environ 4k octets. Votre filtre limite la sortie afin que vous ne voyiez rien tant que ce filtre n'a pas écrit suffisamment de sortie. Une fois qu'il en aura collecté suffisamment, il sera écrit dans un bloc et vous devriez alors voir plusieurs lignes émises.

Essayez de déclencher des recherches DNS plusieurs fois et voyez ce qui se passe ensuite.

Keith
la source
1

expecta une unbuffercommande pour tromper les commandes en supposant qu'elles écrivent sur un tty, donc elles ne tamponnent pas.

ninjalj
la source
1

Je construis un wrapper de surveillance en temps réel autour de tcpdump qui a besoin de voir les paquets dès qu'ils sont disponibles. Même avec un -lcertain retard.

tcpdump l'a maintenant --immediate-mode, ce qui a résolu ce problème pour moi. Afin de le faire fonctionner, je l'ai utilisé avec -l.

Voir cette réponse .

anderspitman
la source