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

このコマンドはどのように機能しますか? mkfifo /tmp/f; cat /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) でリモート サーバーに接続するとシェル プロンプトが開き、クライアントは任意のコマンドを実行できます。しかし、これはどのように機能するのでしょうか?

答え1

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

cat は FIFO で開いたままであることに注意してください。これが最初の手がかりです。sh が実行される場合、sh が行うことは、stdout と strerr を TTY に送ることだけです。代わりに、sh は TTY に接続されていません。通常、sh は TTY に接続されると自動的に対話モードになりますが、そうではないため、-i オプションが追加されています。つまり、新しいコマンドの入力を引き続き受け取ります。これらのコマンドの出力は nc の stdin に送られ、nc の出力 (ネットワーク経由で送信されるコマンド) は FIFO にリダイレクトされます。

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

もっと簡単に言えば、sh と nc がループ内で相互にリダイレクトするということです。コマンドの残りの部分は単なるおまけです。

関連情報