背景
リモートサーバーで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 コマンドが何もキャプチャできない場合もあり、何もキャプチャできない場合もあります。キャプチャが失敗してもエラーメッセージは表示されません。
今まで試したこと
ご覧のとおり、リモートコンピュータとローカルコンピュータ間のダンプファイルの場所を変更してみました。これはあまり差がないようです。
私は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
最後に、特にリモート側で生成されたすべての一時ファイルを削除することをお勧めします。
PS:コメントに記載されているOPのリモートシステムはBusyBoxなので、timeout
オプションはパッケージとは異なりますcoretutils
。また、BusyBoxに言及するように質問を編集しました。