BusyBoxコマンドは実際に組み込まれていますか?

BusyBoxコマンドは実際に組み込まれていますか?

私はその有名なものを読んでいます。Unixの回復凡例、突然知りたいです。

BusyBoxシェルを開き、BusyBoxバイナリ自体が削除された場合でも、BusyBoxバイナリに含まれるすべてのコマンドを使用できますか?

明らかに、このコマンドのBBバージョンは利用できませんその他bashBusyBoxファイル自体はbash開かず実行されませんので、同じシェルを実行してください。ただし、実行中の BusyBox インスタンスでは、BB が 2 つの方法でコマンドを実行できるようです。

  1. BusyBox の新しいインスタンスをフォークして実行し、適切な名前で呼び出し、ディスクから BusyBox ファイルを読み込み、これを行います。
  2. 指定されたコマンドを実行するために、いくつかの内部ロジックを分岐して実行できます(たとえば、関数呼び出しで実行)。

(1)このBusyBoxがどのように機能するかであれば、BBバイナリを削除した後にBusyBoxが提供するいくつかのコマンドが実行中のBBインスタンスで利用できなくなると予想できます。

(2)がこのように動作する場合、BusyBoxはBB自体が削除されたシステムを回復するためにも使用できます。ただし、まだアクセス可能で実行中の BusyBox インスタンスが必要です。

これはどこにも文書化されていますか?そうでなければ安全にテストする方法はありますか?

ベストアンサー1

デフォルトでは、BusyBoxは組み込みのアプレット(並列コマンドを使用)でbusybox --help特別な操作を実行しません。

ただし、コンパイル時にオプションFEATURE_SH_STANDALONEが有効になっている場合、FEATURE_PREFER_APPLETSBusyBox sh1は既知のアプレット名でコマンドを実行したときに通常の検索を実行せず、代わりにショートカットを介して組み込みPATHアプレットを実行します。

  • ソースコードで「noexec」と宣言されたアプレットは、分岐プロセスで関数呼び出しとして実行されます。BusyBox 1.22以降、次のアプレットはnoexecです:chgrp、、、、、、、、、、、、、、、、、、、、、、、、、、、、、.​​​​chmodchowncksumcpcutdddos2unixenvfoldhdheadhexdumplnlsmd5summkfifomknodsha1sumsha256sumsha3sumsha512sumsorttacunix2dos
  • ソースコードで「nofork」と宣言されたアプレットは、同じプロセスで関数呼び出しとして実行されます。BusyBox 1.22以降、次のアプレットはnoforkです:[[、、、、、、、、、、、、、、、、、、、、、、、、、、、、.​​​​​​​[basenamecatdirnameechofalsefsynclengthlognamemkdirprintenvprintfpwdrmrmdirseqsynctesttrueusleepwhoamiyes
  • 他のアプレットはとを使用してこれを行いますforkが、BusyBoxはexecveクエリを実行せず、代わりに可能であればパスを実行し(通常はLinuxでは)、そうでない場合はコンパイル時に定義されたパスを実行します。PATH/proc/self/exe

これについての詳細は、次の文書で説明されています。docs/nofork_noexec.txt。アプレット宣言は次の場所にあります。include/applets.src.hソースコードから。

ほとんどのデフォルト設定では、BusyBoxが他のシェルのように外部コマンドを実行するようにこれらの機能を無効にします。 Debian は両方のバージョンでこれらの機能を有効にします。busyboxそしてbusybox-staticバッグ。

FEATURE_SH_STANDALONEしたがって、BusyBox実行可能ファイルを使用してコンパイルした場合は、実行可能ファイルが削除されてもFEATURE_PREFER_APPLETSBusyBoxシェルですべてのBusyBoxコマンドを実行できます(使用できない場合は上記にリストされていないアプレットを除く)。/proc/self/exe

1 BusyBoxには実際にashとhushの2つの「sh」実装がありますが、この点では同じように動作します。

おすすめ記事