배경
원격 서버에서 BusyBox를 실행하고 있습니다.
두 가지 작업을 수행하는 bash 스크립트가 있습니다.
1. ssh를 통해 tcpdump 명령을 사용하여 tcp 트래픽을 모니터링하는 하위 프로세스를 시작합니다. 원격 컴퓨터 또는 로컬 컴퓨터에 결과를 파일로 저장합니다. 둘 다 시도했습니다.
2. 두 번째 하위 프로세스를 시작하여 TCP 트래픽을 생성합니다.
코드 세그먼트:
#html_tcpdumpfile="$(ssh remotemachine.mydomain.net \"mktemp\")"
html_tcpdumpfile=$(mktemp)
test_steps=(
#"{ ssh remotemachine.mydomain.net \"timeout -t 20 tcpdump -nvi eth0 port 5060 > "$html_tcpdumpfile" \" ; }"
"{ ssh remotemachine.mydomain.net \"timeout -t 20 tcpdump -i eth0 port 5060 \"> $html_tcpdumpfile; }"
"{ ssh remotemachine.mydomain.net \"timeout -t 15 cat /tmp/htmlemail.txt | /etc/postfix/process_email.py \"; }"
)
pids=()
for index in ${!test_steps[@]}; do
(echo "${test_steps[$index]}" | bash) &
pids[${index}]=$!
echo "$pids[${index}] is the pid"
done
#shouldn't really need this because of the timers but... just in case...
for pid in ${pids[*]};
do
wait $pid;
done;
# ============ ANALYZE TEST RESULTS
echo "========== html_tcpdumpfile CONTENTS ============="
cat $html_tcpdumpfile
echo "========== html_tcpdumpfile CONTENTS ============="
질문
tcpdump 명령이 아무것도 캡처하지 못하는 경우도 있고, 아무것도 캡처하지 못하는 경우도 있습니다. 캡처가 실패해도 오류 메시지가 표시되지 않습니다.
내가 지금까지 시도한 것
보시다시피 원격 컴퓨터와 로컬 컴퓨터 사이에서 덤프 파일의 위치를 변경해 보았습니다. 이것은 별 차이가 없는 것 같습니다.
저는 TCP 트래픽이 항상 생성된다는 것을 증명했습니다. 스크립트를 실행할 때마다 다른 SSH 세션이 열려 있고 트래픽이 생성되는 것을 볼 수 있기 때문입니다. 내 스크립트가 간헐적으로 이를 포착하지 못하는 것뿐입니다.
충분한 시간을 확보하기 위해 tcp 세션의 시간 초과 값을 큰 값으로 늘려 보았습니다. 그러나 나는 그것이 문제라고 생각하지 않습니다.
어떤 제안이라도 대단히 감사하겠습니다. 감사해요.
편집 1
각 하위 프로세스를 시작하는 사이에 수면을 도입해 보았습니다.
pids=()
for index in ${!test_steps[@]}; do
(echo "${test_steps[$index]}" | bash) &
sleep 5
pids[${index}]=$!
echo "$pids[${index}] is the pid"
done
그러나 그것은 아무런 차이가 없습니다.
편집 2
tcpdump 명령을 다음과 같이 변경했습니다.
test_steps=(
"{ ssh remotemachine.mydomain.net \"timeout -t 30 tcpdump -nlc 100 -i eth0 port 5060 \"> $rtf_tcpdumpfile; }"
"{ ssh remotemachine.mydomain.net \"timeout -t 20 tail -f /var/log/messages \" > $syslog; }"
"{ ssh remotemachine.mydomain.net \"timeout -t 15 cat /tmp/htmlemail.txt | /etc/postfix/process_email.py \"; }"
)
tcpdump는 여전히 간헐적으로 캡처에 실패하지만... 흥미롭게도 syslog는 항상 성공적으로 캡처를 관리합니다. (Python 스크립트는 호출될 때 실제로 시스템 로그에 기록하므로 스크립트가 실행 중인지 확인/증명할 수 있습니다.)
답변1
첫째, 공간이 제한된 장치/IoT를 다루는 경우 호출자의 출력을 처리합니다. 즉, ssh
아래와 같이 명령 뒤에 >를 사용합니다.
ssh "command" > output.txt
tcpdump
나는 그것을 정책으로 계속 제거하지 않을 것이며 버퍼를 잃을 위험이 있습니다 . 이로 인해 출력이 나오지 않을 수도 있습니다.
캡처되는 패킷에 제한을 두겠습니다. 또한 DNS 문제를 해결하지 않으려고 노력합니다. 예를 들어 100개의 패킷을 캡처하려면 다음을 수행합니다.
tcpdump -nc 100 -i eth0 port 5600
로컬 시스템에 캡처 파일을 저장하는 경우 cat
원격 및 로컬이 아닌 로컬에서만 실행해야 합니다.
tcpdump
마찬가지로, 둘 다 원격 으로 실행하면 cat
둘 다 동시에 실행되며 원격이나 로컬 모두 cat
아무것도 표시되지 않습니다.
@MarkPlotnick의 제안에 따라 행 버퍼링 도 추가 -l
했습니다 . tcpdump
이렇게 하면 이 옵션이 필요하지 않을 수 있습니다 -c
. 나는 둘 다 사용할 것입니다.
그래서 스크립트를 다음과 같이 변경하겠습니다.
#!/bin/bash
html_tcpdumpfile=$(mktemp)
ssh remotemachine.mydomain.net "timeout -t 20 tcpdump -nlc 100 -i eth0 port 5060 " > $html_tcpdumpfile
cat $html_tcpdumpfile
rm $html_tcpdumpfile
아니면 임시 파일을 명시적으로 생성할 필요조차 없을 수도 있습니다.
#!/bin/bash
ssh remotemachine.mydomain.net "timeout -t 20 tcpdump -nlc 100 -i eth0 port 5060 " \
| less
마지막으로, 특히 원격 측에서 생성된 모든 임시 파일을 삭제하는 것이 좋습니다.
추신: 의견에 언급된 OP의 원격 시스템은 BusyBox이므로 timeout
옵션이 패키지와 다릅니다 coretutils
. 또한 BusyBox를 언급하도록 질문을 편집했습니다.