Cara memproses / menyalurkan output TCPDUMPs secara realtime

27

Jika saya ingin tcpdump permintaan DNS oleh klien (pada router OpenWrt 10.04), maka saya

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

Sepenuhnya ok. Tapi. Mengapa saya tidak bisa mem-pipe output tcpdump secara realtime?

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

Jika saya awk, dll. Apa pun setelah tcpdump, saya tidak mendapatkan output APA PUN. Mengapa demikian? Mengapa saya tidak bisa memproses output tcpdump dengan pipelining secara realtime? (sehingga mis.: dalam contoh hanya menampilkan kolom ke-3)

Apakah ada solusi untuk ini?

LanceBaynes
sumber

Jawaban:

35

Langsung dari 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
sumber
7

Gunakan opsi -Udalam kombinasi dengan -wsehingga tcpdump segera menulis paket.

Julius Junghans
sumber
3

Tcpdump tampaknya buffering output ketika ia menulis ke sebuah pipa. Ini bukan pembilasan output untuk setiap penulisan, sehingga sistem akan menulis output dalam potongan sekitar 4k byte. Filter Anda membatasi put out sehingga Anda tidak akan melihat apa-apa sampai filter tersebut menghasilkan output yang cukup. Setelah mengumpulkan cukup itu akan ditulis dalam potongan dan Anda akan melihat beberapa baris dipancarkan kemudian.

Cobalah untuk memicu pencarian DNS berkali-kali dan lihat apa yang terjadi kemudian.

Keith
sumber
1

expectmemiliki unbufferperintah untuk mengelabui perintah dengan asumsi mereka menulis ke tty, sehingga mereka tidak buffer.

ninjalj
sumber
1

Saya sedang membangun pembungkus pemantauan real-time di sekitar tcpdump yang perlu melihat paket segera setelah tersedia. Bahkan dengan -lada beberapa penundaan.

tcpdump sekarang telah --immediate-mode, yang memecahkan masalah ini untuk saya. Untuk membuatnya berfungsi, saya menggunakannya bersama -l.

Lihat jawaban ini .

anderspitman
sumber