stdin / stdoutから読み取りと書き込みを行う2つの(UNIX)プログラムAとBがあります。
私の最初の問題は、AのstdoutをBのstdinに接続し、BのstdoutをAIeのstdinに接続する方法です。Bしかし双方向パイプ。execを使用してリダイレクトすることでこれを解決できると思いますが、機能させることができませんでした。プログラムはインタラクティブであるため、一時ファイルは機能しません。
2番目の問題は、各方向を複製し、ロギングプログラムを介して複製をstdoutにパイプして、プログラム間を通過する(テキスト行ベースの)トラフィックを確認できるようにすることです。ここで、最初の問題を解決できれば、tee>(...)で逃げることができます。
これらの問題はどちらもよく知られている解決策があるはずですが、私は何も見つけることができませんでした。
私はPOSIXシェルソリューション、または少なくともcygwinのbashで機能するものを好みます。
あなたの答えのおかげで、私は次の解決策を思いつきました。A / Bコマンドは、ncを使用して2つのポートをリッスンします。ロギングプログラムはsedを使用します(バッファなしの処理には-uを使用)。
bash-3.2$ fifodir=$(mktemp -d)
bash-3.2$ mkfifo "$fifodir/echoAtoB"
bash-3.2$ mkfifo "$fifodir/echoBtoA"
bash-3.2$ sed -u 's/^/A->B: /' "$fifodir/echoAtoB" &
bash-3.2$ sed -u 's/^/B->A: /' "$fifodir/echoBtoA" &
bash-3.2$ mkfifo "$fifodir/loopback"
bash-3.2$ nc -l -p 47002 < "$fifodir/loopback" \
| tee "$fifodir/echoAtoB" \
| nc -l -p 47001 \
| tee "$fifodir/echoBtoA" > "$fifodir/loopback"
これは、ポート47001および47002への接続をリッスンし、すべてのトラフィックを標準出力にエコーします。
シェル2では次のことを行います。
bash-3.2$ nc localhost 47001
シェル3では次のことを行います。
bash-3.2$ nc localhost 47002
これで、シェル2に入力された行はシェル3に書き込まれ、その逆も同様で、トラフィックはシェル1に記録されます。
B->A: input to port 47001
A->B: input to port 47002
上記はCygwinでテストされています
更新:上記のスクリプトは数日後に動作を停止しました(!)。どうやらそれはデッドロックする可能性があります。回答の提案のいくつかは、より信頼できるかもしれません。