Cách xử lý / ống đầu ra TCPDUMPs trong thời gian thực


27

Nếu tôi muốn tcpdump các yêu cầu DNS của khách hàng (trên bộ định tuyến OpenWrt 10.04), thì tôi

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

Điều đó hoàn toàn ổn. Nhưng. Tại sao tôi không thể dẫn đầu ra tcpdumps trong thời gian thực?

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

Nếu tôi thức, v.v. bất cứ điều gì sau tcpdump, tôi sẽ không nhận được BẤT K output đầu ra nào. Tại sao vậy? Tại sao tôi không thể xử lý đầu ra của tcpdump bằng pipelining trong thời gian thực? (vì vậy, ví dụ: trong ví dụ chỉ xuất ra cột thứ 3)

Có giải pháp nào cho việc này không?

Câu trả lời:


35

Ra khỏi 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.

7

Sử dụng tùy chọn -Ukết hợp với -wđể tcpdump ghi các gói ngay lập tức.


3

Tcpdump rõ ràng là đầu ra đệm khi nó ghi vào một đường ống. Nó không tuôn ra đầu ra cho mỗi lần ghi, vì vậy hệ thống sẽ ghi đầu ra trong khoảng 4k byte. Bộ lọc của bạn đang giới hạn đặt nên bạn sẽ không thấy gì cho đến khi bộ lọc đó đã ghi đủ đầu ra. Một khi nó thu thập đủ, nó sẽ được viết thành một đoạn và bạn sẽ thấy một vài dòng phát ra sau đó.

Hãy thử kích hoạt tra cứu DNS nhiều lần và xem điều gì sẽ xảy ra sau đó.


1

expectcó một unbufferlệnh để đánh lừa các lệnh giả định rằng chúng đang viết cho một tty, vì vậy chúng không đệm.


1

Tôi đang xây dựng một trình bao bọc theo dõi thời gian thực xung quanh tcpdump cần xem các gói ngay khi chúng có sẵn. Ngay cả với -lmột số chậm trễ.

tcpdump bây giờ đã --immediate-modegiải quyết vấn đề này cho tôi. Để làm cho nó hoạt động, tôi đã sử dụng nó cùng với -l.

Xem câu trả lời này .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.