클라이언트(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 후에 awk와 같은 작업을 수행하면 어떤 출력도 얻지 못합니다. 왜 그런 겁니까? tcpdump의 출력을 실시간으로 파이프할 수 없는 이유는 무엇입니까? (예: 예시에서는 세 번째 열만 출력됩니다.)
해결책이 있나요?
답변1
바로 나가기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.
답변2
-U
-w
tcpdump가 즉시 패킷을 쓰도록 이 옵션을 조합하여 사용하십시오 .
답변3
tcpdump는 파이프에 쓰는 동안 출력을 버퍼링하는 것으로 보입니다. 기록할 때마다 출력을 플러시하지 않으므로 시스템은 출력을 약 4KB 청크로 기록합니다. 필터가 출력을 제한하므로 해당 필터가 충분한 출력을 쓸 때까지 아무 것도 표시되지 않습니다. 충분한 데이터가 수집되면 블록에 기록되고 몇 줄이 표시되는 것을 볼 수 있습니다.
DNS 조회를 여러 번 실행하고 무슨 일이 일어나는지 확인하세요.
답변4
expect
unbuffer
명령이 버퍼링되지 않도록 tty에 쓰고 있다고 가정하도록 속이는 명령이 있습니다 .