Как обрабатывать / передавать данные 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# 

Если я получаю awk и т. Д. Что-нибудь после tcpdump, я не получаю НИКАКОГО вывода. Почему это? Почему я не могу обработать вывод tcpdump с конвейерной передачей в реальном времени? (так что например: в примере только выводит 3-й столбец)

Есть ли какие-то решения для этого?

LanceBaynes
источник

Ответы:

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.
Marcin
источник
7

Используйте опцию -Uв сочетании с -wтак, чтобы tcpdump записывал пакеты немедленно.

Юлий Юнгханс
источник
3

Очевидно, что tcpdump буферизует вывод при записи в канал. Это не сбрасывает вывод для каждой записи, поэтому система запишет вывод примерно в 4-килобайтных блоках. Ваш фильтр ограничен, поэтому вы ничего не увидите, пока этот фильтр не напишет достаточно выходных данных. Как только он соберет достаточно, он будет записан в блоке, и вы должны увидеть несколько строк.

Попробуйте запустить поиск DNS много раз и посмотрите, что произойдет потом.

Кит
источник
1

expectимеет unbufferкоманду обмануть команды, предполагая, что они пишут в tty, чтобы они не буферизировались.

ninjalj
источник
1

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

Теперь есть tcpdump --immediate-mode, который решил эту проблему для меня. Чтобы заставить его работать, я использовал его вместе с -l.

Смотрите этот ответ .

anderspitman
источник