アクセスした URL のトレースを保存したいので、次のようなコマンド ラインを使用します。
tcpdump -ien1 -v -X 'tcp ポート 80' | sed -nl 's/^.0x[0-9a-f]{4}:.{43}(.)$/\1/p' |perl break.pl |perl -pe 's/(GET|POST).(.?).HTTP/1....ホスト:.([a-zA-Z._0-9-])../"\nBEGURL ".localtime().": $1 http://$3$2\n"/ge' | grep "^BEGURL"
1行に1つのURLで問題なく動作します。しかし、
tcpdump -ien1 -v -X 'tcp ポート 80' | sed -nl 's/^.0x[0-9a-f]{4}:.{43}(.)$/\1/p' |perl break.pl |perl -pe 's/(GET|POST).(.?).HTTP/1....ホスト:.([a-zA-Z._0-9-])../"\nBEGURL ".localtime().": $1 http://$3$2\n"/ge' | grep "^BEGURL">> /tmp/out
(末尾に注意してください >> /tmp/out) するとファイルは空になります。なぜかわかりますか? 私にとってはまったく非論理的です。
stdout と stderr を /tmp/out にリダイレクトしてみましたが、やはり空です。ファイルには書き込みアクセス権があります。何が原因かわかりません。stdout と stderr 以外に何かありますか??
助けてください。
答え1
「stdout と stderr を /tmp/out にリダイレクトすることも試しました」と言っている場合、これを試した可能性がありますが、これが最も可能性の高い問題のようです。そのため、最後に 2>&1 を追加してみてください。
そうでない場合は、デバッグを容易にするために、最初のコマンドに 2>/dev/null を追加して、出力がまだ表示されるかどうかを確認してください。
また、テスト用にコマンドを簡略化できますか? たとえば、これは機能しますか:
tcpdump -ien1 -v -X 'tcp port 80' >> /tmp/out
答え2
数日前にも同じ問題が発生しました。-w
パケットをファイルに書き込むには、 オプションを使用してみてください。 詳細については、 を参照してくださいman tcpdump
。