web-dev-qa-db-ja.com

端末にnetcat入力を出力する

ファイルのコンテンツをcatしてncにパイプするスクリプトを作成しようとしています。

$cat somefile.txt | nc server port

ファイルの内容は期待どおりにサーバーに送信されますが、ターミナルではサーバーの応答しか表示されません。

自分が送信したものも表示されるようにするには、何をする必要がありますか。

Somefile.txtから行ごとに異なる応答が返されますが、すべてをまとめたいと思います。

1
user2294018

teeを使用して、プロセス置換を利用できます。

_$ cat somefile.txt | tee >(nc server port)
_

teeは、そのinputを両方のstdoutおよびファイルにコピーするだけです。

<()bashプロセス置換)を使用すると、bashにファイルではなくコマンドの入力に書き込むように指示します。

2
Mr Shunz

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
0
that other guy