tcpdump によって生成された .pcap パケット キャプチャ ファイルをテキスト形式に変換しようとしています。.pcap ファイルを変換しようとすると、または tcpdump の stdout を単に「>」にポートしてテキスト ファイルに変換しようとすると、アクセス許可エラーが発生します。
方法1:
パケットキャプチャファイルを生成する
sudo tcpdump -i wlan0 -w /var/log/tcpdump/tcpdump-log-06-03-2015.pcap
.pcapファイルを変換しようとすると、
sudo tshark -V -r tcpdump-log-06-03-2015.pcap > tcpdump-log-06-03-2015.txt
しかし、次のような権限拒否エラーが発生します。
bash: tcpdump-log-06-03-2015.txt: Permission denied
方法2:
パケットキャプチャファイルを生成する
sudo tcpdump -i wlan0 > /var/log/tcpdump/tcpdump-log-06-03-2015.txt
同様のアクセス拒否エラーが発生します:
bash: /var/log/tcpdump/tcpdump-log-06-03-2015.txt: Permission denied
両方のコマンドを sudo として実行しているので、権限は問題にならないと考えました。
次のコマンドを実行して、tcpdump の apparmor を無効にしました。
sudo apparmor_parser -R /etc/apparmor.d/usr.sbin.tcpdump
なぜこのようなことが起こるのか、誰か説明してくれませんか? または、tcpdump の読みやすいテキスト出力を生成するためのより良い方法を提案してくれませんか?
答え1
問題は、コマンドのリダイレクト部分が、root ではなくユーザーとして実行されることです。
したがって、宛先ディレクトリをそのままにしておきたい場合は、その部分も root として実行する必要があります。あるいは、宛先ディレクトリを書き込みアクセス権のあるディレクトリにすることもできます。
これが機能しない理由を示す例 (結果のファイルの権限に注意してください)。
$ sudo tcpdump -n -tttt -r eth1-2015-04-16-17-01-35.bin > vvvbbb.txt
reading from file eth1-2015-04-16-17-01-35.bin, link-type EN10MB (Ethernet)
$ ls -l vvvbbb.txt
-rw-rw-r-- 1 doug doug 5418673 Jun 2 16:53 vvvbbb.txt
機能する方法の例 (ここでも、結果のファイルの権限に注意してください):
$ sudo su
# tcpdump -n -tttt -r eth1-2015-04-16-17-01-35.bin >vvvbbb.txt
reading from file eth1-2015-04-16-17-01-35.bin, link-type EN10MB (Ethernet)
# ls -l vvvbbb.txt
-rw-r--r-- 1 root root 5418673 Jun 2 16:57 vvvbbb.txt
# exit
exit
$
動作するが、ターミナルにも出力されるため望ましくない可能性がある別の方法の例:
$ sudo tcpdump -n -tttt -r eth1-2015-04-16-17-01-35.bin | sudo tee vvvbbb.txt
... delete tons of spew to terminal ...
$ ls -l vvv*.txt
-rw-r--r-- 1 root root 5418673 Jun 2 17:01 vvvbbb.txt
注: ここでは tshark の代わりに tcpdump を使用しましたが、これは tshark がインストールされていないためです。