वास्तविक समय में TCPDUMPs आउटपुट को कैसे प्रोसेस / पाइप करें


27

यदि मैं क्लाइंट (एक OpenWrt 10.04 राउटर पर) द्वारा DNS अनुरोधों को tcpdump करना चाहता हूं, तो मैं

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 जाहिरा तौर पर बफरिंग आउटपुट है जब यह एक पाइप को लिखता है। यह प्रत्येक लिखने के लिए आउटपुट फ्लशिंग नहीं है, इसलिए सिस्टम आउटपुट को लगभग 4k बाइट विखंडू में लिखेगा। आपका फ़िल्टर पुट को सीमित कर रहा है इसलिए आपको कुछ भी दिखाई नहीं देगा जब तक कि फ़िल्टर ने पर्याप्त आउटपुट नहीं लिखा हो। एक बार जब यह पर्याप्त रूप से एकत्र हो जाता है तो इसे एक कबाड़ में लिखा जाएगा और आपको तब उत्सर्जित होने वाली कई लाइनों को देखना चाहिए।

DNS लुकअप को कई बार ट्रिगर करने का प्रयास करें और देखें कि तब क्या होता है।


1

expectएक unbufferआदेश को मूर्ख बनाने के लिए एक आदेश है कि वे एक छोटे से लिख रहे हैं, इसलिए वे बफर नहीं करते हैं।


1

मैं tcpdump के आसपास एक रीयल-टाइम मॉनिटरिंग रैपर का निर्माण कर रहा हूं, जो उपलब्ध होते ही पैकेट देखने की जरूरत है। यहां तक ​​कि -lकुछ देरी से भी।

tcpdump अब है --immediate-mode, जिसने मेरे लिए इस समस्या को हल कर दिया है। काम करने के लिए इसे प्राप्त करने के लिए मैंने इसका इस्तेमाल किया -l

इस जवाब को देखें ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.