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.