今日、私はnc
のマニュアルページを読んでいて、このコマンドに出くわしました。そんなこと知ってる:
mkfifo /tmp/f
は/ tmp/fに名前付きパイプを作成しています。
cat /tmp/f
はその名前付きパイプに書き込まれたものをすべて出力し、cat /tmp/f
の出力は/bin/sh
にパイプされます。
/bin/sh
はインタラクティブに実行されており、stderrはstdoutにリダイレクトされます。実行時に、そのポートでリモートサーバーに接続すると、1234はシェルプロンプトを開き、クライアントは任意のコマンドを実行できます。しかし、それはどのように機能しますか?
このようなコマンドは、IOリダイレクトと、TTYに接続されたときにデフォルトでオンになるshインタラクティブモードを利用しています。
CatはFIFOで開いたままであることに注意してください。それがあなたの最初の手がかりです。 shが実行されるとき、そのすべてのことは、そのstdoutを指示し、TTYに向けます。代わりに、shはTTYにアタッチされていません。通常、shはTTYに接続されると自動的にインタラクティブモードになりますが、-iオプションが追加されていないためです。つまり、新しいコマンドの入力を継続します。これらのコマンドの出力はncのstdinに送信され、ncの出力(ネットワーク経由で送信されるコマンド)はFIFOにリダイレクトされます。
FIFOは、本質的に名前付きパイプとして使用され、リダイレクトのリングを完成させます。
Shとncがループ内で相互にリダイレクトしているので、より簡単に考えることができます。コマンドの残りの部分はただの綿毛です。