ファイルのコンテンツをcatしてnc
にパイプするスクリプトを作成しようとしています。
$cat somefile.txt | nc server port
ファイルの内容は期待どおりにサーバーに送信されますが、ターミナルではサーバーの応答しか表示されません。
自分が送信したものも表示されるようにするには、何をする必要がありますか。
Somefile.txtから行ごとに異なる応答が返されますが、すべてをまとめたいと思います。
tee
を使用して、プロセス置換を利用できます。
_$ cat somefile.txt | tee >(nc server port)
_
tee
は、そのinputを両方のstdout
およびファイルにコピーするだけです。
<()
(bash
プロセス置換)を使用すると、bash
にファイルではなくコマンドの入力に書き込むように指示します。
tee
を使用して、プロセス置換を回避できます。
$ ( cat somefile.txt | tee /dev/fd/3 | nc Host port ) 3>&1
これの利点は、nc
が同期的に実行されることです。非同期プロセス置換動作の例を次に示します。
user@hostname $ cat somefile.txt
GET / HTTP/1.0
Host: StackOverflow.com
user@hostname $ cat somefile.txt | tee >(nc stackoverflow.com 80); echo "DONE"
GET / HTTP/1.0
Host: StackOverflow.com
DONE
user@hostname $ HTTP/1.1 301 Moved Permanently
Content-Type: text/html; charset=utf-8
Location: https://stackoverflow.com/
[...]
「DONE」と表示され、出力の中央にプロンプトが表示されることに注意してください。 nc
が同期的に実行される場合、これは問題ではありません。
user@hostname $ ( cat somefile.txt | tee /dev/fd/3 | nc stackoverflow.com 80 ) 3>&1; echo "DONE"
GET / HTTP/1.0
Host: StackOverflow.com
HTTP/1.1 301 Moved Permanently
Content-Type: text/html; charset=utf-8
Location: https://stackoverflow.com/
[...]
DONE