このコマンドはどのように機能しますか? mkfifo /tmp/f;cat/tmp/f | /bin/sh -i 2>&1 | NC -l 1234

このコマンドはどのように機能しますか? mkfifo /tmp/f;cat/tmp/f | /bin/sh -i 2>&1 | NC -l 1234

私は今日のマニュアルページを読んでいる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がループ内で互いにリダイレクトすることで、より簡単に考えることができます。残りのコマンドは役に立ちません。

関連情報