Jak przetwarzać / przetwarzać dane wyjściowe TCPDUMP w czasie rzeczywistym


27

Jeśli chcę tcpdump żądań DNS klientów (na routerze OpenWrt 10.04), to ja

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

To jest w porządku. Ale. Dlaczego nie mogę przesyłać danych wyjściowych tcpdumps w czasie rzeczywistym?

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

Jeśli awknę itp. Po tcpdump, nie otrzymam ŻADNEGO wyniku. Dlaczego? Dlaczego nie mogę przetwarzać danych wyjściowych programu tcpdump z potokowaniem w czasie rzeczywistym? (tak, że np .: w przykładzie wyświetla tylko trzecią kolumnę)

Czy są na to jakieś rozwiązania?

Odpowiedzi:


35

Prosto z 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.


3

Tcpdump najwyraźniej buforuje dane wyjściowe, gdy zapisuje do potoku. Nie wypłukuje danych wyjściowych dla każdego zapisu, więc system zapisze dane wyjściowe w około 4k bajtowych porcjach. Twój filtr jest ograniczony, więc nic nie zobaczysz, dopóki ten filtr nie wypisze wystarczającej ilości danych wyjściowych. Gdy zgromadzi wystarczającą ilość, zostanie zapisany we fragmencie i powinieneś zobaczyć kilka wyemitowanych linii.

Spróbuj uruchomić zapytania DNS wiele razy i zobacz, co się wtedy stanie.


1

expectma unbufferpolecenie, aby oszukać polecenia, zakładając, że piszą do tty, więc nie buforują.


1

Buduję opakowanie monitorujące w czasie rzeczywistym wokół tcpdump, które musi widzieć pakiety, gdy tylko będą dostępne. Nawet z -lpewnym opóźnieniem.

tcpdump ma teraz --immediate-mode, co rozwiązało ten problem dla mnie. Aby go uruchomić, użyłem go w połączeniu z -l.

Zobacz tę odpowiedź .

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.