다음 명령을 실행하려고 합니다.
$ tcpdump -l -X -i eth1 -n tcp port <port> | tee capture.txt | \
scp capture.txt [email protected]:/home/checker/
tcpdump -l -X -i eth1 -n tcp port <port>
1단계에서는 "-l"을 사용하여 표준 출력 라인을 버퍼링하여 패킷이 도착할 때 각 패킷에 쓸 수 있도록 패킷을 캡처합니다.
tee capture.txt
2단계
man tee
: "티 유틸리티는 표준 입력을 표준 출력으로 복사하여 0개 이상의 파일에 복사본을 만듭니다."scp capture.txt root@<remote-IP>:/home/
3단계에서는 Capture.txt 파일을 원격 호스트로 보냅니다.
질문
1단계와 2단계만 수행하면 모든 패킷이 지정된 포트에서 캡처됩니다. 그러나 3단계도 사용하면 capture.tx
t에 모든 패킷이 포함되지 않습니다(몇 개만). 몇 분 전에는 정상적으로 실행되었기 때문에 실망스럽습니다!
여기에 문제가 있나요?
답변1
이 tee
명령은 데이터가 수신되면 출력 파일에 데이터를 쓰지만 scp
파일은 즉시 한 번만 복사됩니다. 파이프라인의 모든 명령은 동시에(또는 거의 동시에) 실행되므로 출력되는 패킷의 수가 적거나 전혀 없습니다.캡처.txt파일이 복사되기 전의 파일입니다 scp
.
원하는 것을 수행하는 방법에는 여러 가지가 있습니다.
원격 호스트에서 일부 패킷을 복사한 tcpdump
다음 완료되면 파일을 원격 호스트로 전송하려는 경우 이 옵션을 사용하여 해당 수의 패킷을 캡처한 후 종료할 수 있습니다 -c
. 및 명령이 완료된 후에 실행되도록 세미콜론을 사용하여 tcpdump
명령을 파이프에서 분리합니다.scp
tcpdump
tee
tcpdump -l -c 10 | tee /tmp/capture.txt; scp /tmp/capture.txt root@remotehost:/tmp
또는 패킷을 실시간으로 보고 실시간으로 복사하려면 다음 명령에서 tee
패킷을 /dev/tty에 출력하여 패킷을 확인한 다음 파이프하여 ssh
원격 호스트의 파일에 쓸 수 있습니다.
tcpdump -l | tee /dev/tty | ssh root@remotehost "cat > /tmp/capture.txt"
-c
여기에 옵션이 없으면 tcpdump는 사용자가 종료할 때까지 실행됩니다.
로컬 및 원격 Capture.txt 파일에 패킷을 저장하려면 다음 tee
명령을 사용할 수 있습니다.
tcpdump -l | tee /tmp/capture.txt | tee /dev/tty | ssh root@remotehost "cat > /tmp/capture.txt"
답변2
scp가 Capture.txt를 읽을 때 tee가 쓰기를 완료했다는 보장은 없습니다. 당신이 할 수 있는 일은 tee의 stdout을 사용하고 다음과 같이 ssh를 통해 파이프하는 것입니다:
tcpdump -l -X -i eth1 -n tcp port <port> | tee capture.txt | \
ssh [email protected] 'cat > /home/checker/capture.txt'
답변3
여기서 문제는 복사 중인 파일이 scp
연속이 아닌 특정 순간에 복사되므로 결국 서버 10.3.3.227에 파일 내용의 조각이 남는다는 것입니다.
이 시도:
$ sudo tcpdump -l -X -i eth1 -n <tcp port> | tee capture.txt | \
ssh [email protected] 'cat > /home/checker/capture.txt