Як обробляти / передавати вихід TCPDUMP в режимі реального часу


27

Якщо я хочу tcpdump запити DNS клієнтами (на маршрутизаторі OpenWrt 10.04), я

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

Це повністю нормально. Але. Чому я не можу передавати вихід tcpdumps в режимі реального часу?

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

Якщо я пробуджу і т. П. Що-небудь після tcpdump, я не отримую жодного виводу. Чому так? Чому я не можу обробити вихід tcpdump з конвеєрним режимом у режимі реального часу? (так що, наприклад: у прикладі виводиться лише 3-й стовпець)

Чи є для цього рішення?

Відповіді:


35

Прямо з 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 буферизує вихід, коли пише в трубу. Це не змивання виводу для кожного запису, тому система записуватиме вихід приблизно в 4 кбайт байти. Ваш фільтр обмежений у встановленому стані, тому ви нічого не побачите, поки цей фільтр не напише достатньо виводу. Після того, як він збереться достатньо, він буде виписаний у шматок, і тоді ви побачите кілька рядків.

Спробуйте запустити пошук DNS багато разів і подивіться, що буде потім.


1

expectмає unbufferкоманду обдурити команди, припускаючи, що вони пишуть у tty, тому вони не буферні.


1

Я будую обгортку моніторингу в режимі реального часу навколо tcpdump, який повинен бачити пакети, як тільки вони з’являться. Навіть з -lдеякою затримкою.

tcpdump зараз має --immediate-mode, що вирішило цю проблему для мене. Для того, щоб він працював, я використовував його спільно з -l.

Дивіться цю відповідь .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.