tcpdump - 파이프가 있는 실시간 DNS 로거

tcpdump - 파이프가 있는 실시간 DNS 로거

stdout에서 tcpdump를 사용하여 실시간으로 DNS A 레코드를 얻고 싶습니다.

tcpdump -i any dst port 53 | awk '/ A\? / {u = NF - 1; print $u}' | sed 's/.$//g'

위 줄에는 출력이 없습니다. Tcpdump는 여전히 파이프 등에서 버퍼링 중인 것 같습니다. 나도 -l --immediate-mode그것을 테스트했습니다 -U.

다음 줄은 올바르게(라이브) 출력되지만 분명히 필터링되지 않은 것 같습니다(grep/awk 없음).

tcpdump -i any dst port 53

위의 awk/sed 명령에 출력 라인을 수동으로 보내면 제대로 작동합니다.

모든 것은 Arch Linux 및 Android 8.1(bash, tcpdump 4.9.2)에서 테스트되었습니다.

질문: 실시간으로 tcpdump 출력을 얻기 위해 Pipe/awk/sed를 사용하는 방법은 무엇입니까?

2011년의 오래된 스레드는 잘리지 않습니다. TCPDUMP 출력을 실시간으로 처리/파이프라인하는 방법

답변1

다음 변형을 시도해 보세요.

tcpdump -l -i any dst port 53 | stdbuf -oL awk '/ A\? / {u = NF - 1; print $u}' | sed 's/.$//g'

tcpdump 출력의 각 라인을 버퍼링해야 하며 옵션은 -l이 목적으로 사용됩니다.

에서 man tcpdump:

-l     Make stdout line buffered.  Useful if you want to see the data while capturing it.

awk 출력 라인을 버퍼링하도록 설정표준 버퍼사용된.

-o, --output=MODE  adjust standard output stream buffering
If MODE is 'L' the corresponding stream will be line buffered.

관련 정보