netcatとteeのリダイレクトスタイルが異なる場合、結果は異なります。

netcatとteeのリダイレクトスタイルが異なる場合、結果は異なります。

単純なHTTP GETリクエストとレスポンスの追跡中にnc奇妙なことが見つかりました。

たとえば、これはうまくいきます。inファイルには最終的にHTTP GET要求とoutファイル応答が含まれます。

$ mkfifo p
$ (nc -l 4000 < p | tee in | nc web-server 80 | tee out p)&
[1] 8299
$ echo "GET /sample" | nc localhost 4000
This is contents of /sample...
$ cat out
This is contents of /sample...
$

ただし、tee out p上記を変更するとtee out >pファイルoutが空になります。

$ (nc -l 4000 < p | tee in | nc web-server 80 | tee out > p)&
[1] 8312
$ echo "GET /sample" | nc localhost 4000
$ cat out
$ 

なぜですか?

編集する:私はRHEL 5.3(Tikanga)を使用しています。

ベストアンサー1

問題は、同じファイルを読み書きするためにシェルリダイレクトを使用していることです。後で確認するとp空になります。シェルはファイルを読み取りモードで開き、ファイルを切り取り、コマンドを実行する前にパイプを設定します。ただし、を使用するとteeファイル自体が開き、入力を読み取る前にファイルが切り捨てられません。これはよく知られており、文書化された動作であり、単にリダイレクトを使用してファイルをインラインに変更できない理由です。

おすすめ記事