วิธีประมวลผล / ไพพ์เอาต์พุต TCPDUMPs แบบเรียลไทม์


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 ด้วย pipelining แบบเรียลไทม์? (เพื่อให้เช่น: ในตัวอย่างในผลลัพธ์คอลัมน์ที่ 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คำสั่งให้หลอกคำสั่งโดยสมมติว่าพวกเขากำลังเขียนไปยัง tty ดังนั้นจึงไม่บัฟเฟอร์


1

ฉันกำลังสร้าง wrapper การตรวจสอบตามเวลาจริงรอบ tcpdump ที่ต้องการดูแพ็กเก็ตทันทีที่พร้อมใช้งาน แม้จะ-lมีความล่าช้าบ้าง

ตอนนี้มี tcpdump --immediate-modeซึ่งแก้ไขปัญหานี้ให้ฉัน -lเพื่อที่จะได้ไปทำงานที่ฉันใช้มันร่วมกับ

ดูคำตอบนี้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.