bashスクリプト:リモートサーバーでTCPトラフィックキャプチャが機能している場合や失敗することがあります。エラーなし

bashスクリプト:リモートサーバーでTCPトラフィックキャプチャが機能している場合や失敗することがあります。エラーなし

背景

リモートサーバーでBusyBoxを実行しています。

2つのタスクを実行するbashスクリプトがあります。
1. ssh を介して tcpdump コマンドを使用して、tcp トラフィックを監視するサブプロセスを開始します。リモートコンピュータまたはローカルコンピュータに結果をファイルとして保存します。どちらも試しました。
2. 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

最後に、特にリモート側で生成されたすべての一時ファイルを削除することをお勧めします。

PS:コメントに記載されているOPのリモートシステムはBusyBoxなので、timeoutオプションはパッケージとは異なりますcoretutils。また、BusyBoxに言及するように質問を編集しました。

おすすめ記事