bash 스크립트: 원격 서버에서 TCP 트래픽 캡처가 작동할 때도 있고 실패할 때도 있습니다. 오류 없음

bash 스크립트: 원격 서버에서 TCP 트래픽 캡처가 작동할 때도 있고 실패할 때도 있습니다. 오류 없음

배경

원격 서버에서 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 명령이 아무것도 캡처하지 못하는 경우도 있고, 아무것도 캡처하지 못하는 경우도 있습니다. 캡처가 실패해도 오류 메시지가 표시되지 않습니다.

내가 지금까지 시도한 것

  1. 보시다시피 원격 컴퓨터와 로컬 컴퓨터 사이에서 덤프 파일의 위치를 ​​변경해 보았습니다. 이것은 별 차이가 없는 것 같습니다.

  2. 저는 TCP 트래픽이 항상 생성된다는 것을 증명했습니다. 스크립트를 실행할 때마다 다른 SSH 세션이 열려 있고 트래픽이 생성되는 것을 볼 수 있기 때문입니다. 내 스크립트가 간헐적으로 이를 포착하지 못하는 것뿐입니다.

  3. 충분한 시간을 확보하기 위해 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를 언급하도록 질문을 편집했습니다.

관련 정보