私は今日のマニュアルページを読んでいるnc
間にこのコマンドを偶然見つけました。知っている:
mkfifo /tmp/f
ネームドパイプの作成/tmp/f。cat /tmp/f
この名前付きパイプに書き込まれたすべての内容が印刷され、出力はcat /tmp/f
次にパイプされます。/bin/sh
/bin/sh
対話的に実行され、stderrはstdoutにリダイレクトされます。- `その後、出力はポート1234でリッスンしているncにパイプされます。
- 出力は最終的に名前付きパイプにリダイレクトされます。
実行すると、このポート(たとえば1234)に接続されているリモートサーバーはシェルプロンプトを開き、クライアントは任意のコマンドを実行できます。しかし、どのように動作しますか?
ベストアンサー1
これらのコマンドは、TTYに接続するとデフォルトで有効になっているIOリダイレクトモードとshインタラクティブモードを利用します。
cat は FIFO で開いたままになります。これが最初の手がかりです。 shが実行されたときに実行することは、stdoutとstrerrをTTYに送信するだけです。対照的に、sh は TTY に接続されません。通常、shはTTYに接続すると自動的にインタラクティブモードになりますが、-iオプションを追加しないためです。これは、新しいコマンドの入力を受け入れ続けることを意味します。これらのコマンドの出力はncの標準入力に渡され、ncの出力(つまりネットワーク経由で送信されたコマンド)はFIFOにリダイレクトされます。
FIFOは、デフォルトでリダイレクトループを完了するための名前付きパイプとして使用されます。
shとncがループ内で互いにリダイレクトすることで、より簡単に考えることができます。残りのコマンドは役に立ちません。