次のコマンドを実行しようとしています。
$ 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"