stdout に書き込むことはできるが、ファイルには書き込めない

stdout に書き込むことはできるが、ファイルには書き込めない

アクセスした 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

関連情報