제가 실제로 하고 싶은 일은 10초 동안 tcpdump를 측정하는 것입니다.
$ timeout 10s tcpdump > my.log
그런데 실제 녹음되는 시간은 10초가 아닌 매우 짧은 시간임을 알게 되었습니다.
그래서 저는 이런 실험을 했습니다.
#!/bin/bash
# a.sh
tcpdump & p1=$!
date
sleep 10s;
echo "Checkpoint #1"
kill $p1;
$ sudo ./a.sh # works as expected
$ sudo ./a.sh > my.log # not as expected
# it printed
25s
27s
27s
그래서 실제로는 2초만 녹음됩니다.
Q1. 하고 싶은 일을 어떻게 해야 하나요?
Q2: 터미널(또는 pts?)로 인쇄하는 것이 파일로 인쇄하는 것보다 빠른 이유는 무엇입니까? (그래서 그런 것 같아요.)
답변1
표준 출력이 tty일 때 tcpdump는 "즉시 모드"를 켭니다( pcap_set_immediate_mode(3)
지원하는 시스템에서는 를 통해).그리고(tcpdump는 출력을 위해 stdio 함수를 사용하기 때문에) 출력은 기본적으로 라인 버퍼링됩니다.
그러나 tcpdump의 출력을 파일이나 파이프로 리디렉션할 때는 강제로둘 다패킷을 파일에 "라이브"로 기록하려는 경우 명시적 즉시 모드 및 라인 버퍼링.
tcpdump --immediate-mode -l > my.log
-n
이 옵션을 사용 하지 않고 tcpdump
DNS를 통한 주소 역방향 조회를 시도할 수도 있는데, 이 경우 시간이 많이 걸릴 수 있습니다.
tcpdump --immediate-mode -nl > my.log
대화형으로 사용 하지 않는 경우 덤프 원시 패킷을 사용 하고 덤프 파일 읽기를 사용하는 동안 구문 분석하는 것이 tcpdump
가장 좋습니다 . 이 경우 덤프 출력을 "라이브"로 설정하려면 사용해야 합니다.-w
-r
-U
-l
tcpdump --immediate-mode -Uw /path/to/dump
...
tail -c+0 -f /path/to/dump | tcpdump -r-