web-dev-qa-db-ja.com

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

今日、私はncのマニュアルページを読んでいて、このコマンドに出くわしました。そんなこと知ってる:

  • mkfifo /tmp/f/ tmp/fに名前付きパイプを作成しています。

  • cat /tmp/fはその名前付きパイプに書き込まれたものをすべて出力し、cat /tmp/fの出力は/bin/shにパイプされます。

  • /bin/shはインタラクティブに実行されており、stderrはstdoutにリダイレクトされます。
  • `次に、出力はポート1234でリッスンしているncにパイプされます。
  • そして、出力は最終的に名前付きパイプに再びリダイレクトされます。

実行時に、そのポートでリモートサーバーに接続すると、1234はシェルプロンプトを開き、クライアントは任意のコマンドを実行できます。しかし、それはどのように機能しますか?

4

このようなコマンドは、IOリダイレクトと、TTYに接続されたときにデフォルトでオンになるshインタラクティブモードを利用しています。

CatはFIFOで開いたままであることに注意してください。それがあなたの最初の手がかりです。 shが実行されるとき、そのすべてのことは、そのstdoutを指示し、TTYに向けます。代わりに、shはTTYにアタッチされていません。通常、shはTTYに接続されると自動的にインタラクティブモードになりますが、-iオプションが追加されていないためです。つまり、新しいコマンドの入力を継続します。これらのコマンドの出力はncのstdinに送信され、ncの出力(ネットワーク経由で送信されるコマンド)はFIFOにリダイレクトされます。

FIFOは、本質的に名前付きパイプとして使用され、リダイレクトのリングを完成させます。

Shとncがループ内で相互にリダイレクトしているので、より簡単に考えることができます。コマンドの残りの部分はただの綿毛です。

4
jdwolf