1. はじめに
通信テストなどのために、リモートのサーバーでtcpdumpを取得したい場合があると思います。sshで直接ログインしてtcpdumpを実行すれば取得可能ですが、複数のサーバーで同時に取得したい場合や何度も繰り返してテストしたい場合などにスクリプトから実行できると便利です。ここでは、シェルスクリプトからsshを実行してリモートサーバーでtcpdumpを実行する方法を説明します。また、結果のファイルを取得する方法も説明します。
なお、環境はLinuxを想定しています。
2. sshの準備
リモートサーバーにsshでコマンドを発行する際、自動的にコマンドを実行するためにはパスワード入力を避ける必要があります。そのため、以下のリンク等を参考に公開鍵を使用してサーバーAからサーバーBにログインができるように設定してください。
3. sudoの準備
tcpdumpの実行にはコマンドをsudoで実行することが必要となります。sudo実行の際にもパスワード入力が発生することを避けるため、以下のリンク等を参考にパスワード入力無しでsudoが実行できるように設定してください。
4. シェルスクリプト作成
tcpdumpを実行するためには、以下のコマンドを使用します。
$ ssh ユーザー名@サーバーBのアドレス -i 秘密鍵 sudo tcpdump -i インターフェース名 -w 出力先ファイル名 &
*)tcpdumpのオプションについては適宜必要なものを指定してください。
tcpdumpの停止には以下のコマンドを使用します。
$ ssh ユーザー名@サーバーBのアドレス -i 秘密鍵 sudo pkill -x tcpdump
*)サーバーBで実行されているtcpdumpは全てkillされるのでご注意ください。
結果ファイルの転送にはscpを使用します。
$ scp -i 秘密鍵 ユーザー名@サーバーBのアドレス:出力先ファイル ./
上記のコマンドをまとめると、tcpdumpをリモートサーバーで実行して結果ファイルを取得するスクリプトが作成できます。
スクリプト例
192.168.1.211のネットワークインターフェースens33で10秒間tcpdumpを実行し、結果ファイルtest.pcapをカレントディレクトリにコピーするスクリプトです。
#!/bin/bash
ssh -i .ssh/id_rsa test@192.168.1.211 sudo tcpdump -i ens33 -w /tmp/test.pcap &
sleep 10
ssh -i .ssh/id_rsa test@192.168.1.211 sudo pkill -x tcpdump
scp -i .ssh/id_rsa test@192.168.1.211:/tmp/test.pcap ./
実行結果
$ ./remotetcpdump.sh
tcpdump: listening on ens33, link-type EN10MB (Ethernet), snapshot length 262144 bytes
37 packets captured
70 packets received by filter
0 packets dropped by kernel
test.pcap 100% 9562 3.7MB/s 00:00
$
結果ファイルtest.pcapのコピーもできています。
$ ls -ltr
total 223164
〜省略〜
-rwxrw-r-- 1 test test 223 Dec 26 08:47 remotetcpdump.sh
-rw-r--r-- 1 test test 9562 Dec 26 08:49 test.pcap
$