web-dev-qa-db-ja.com

chrootで「ls」コマンドを実行するには?

私はブラウザーのシェル leash を使用していて、phpでシェルコマンドを実行してブラウザーに再試行していますが、chrootコマンドを検出しました。たとえば、ルートディレクトリでlsを実行したいルートを変更しました。実際、bash -c "ls /"を実行する必要があります。私はこれを試しました(Sudoなしで試しましたが、うまくいきませんでした):

Sudo chroot ~/projects/jcubic/leash ls

エラーが発生しました:

chroot: failed to run command ‘ls’: No such file or directory

このコマンドを適切に使用できますか?別のルートディレクトリでlsを実行することは可能ですか?

sudoなしでchrootを実行しようとすると、次のエラーが発生します。

chroot: cannot change root directory to '/home/kuba/projects/jcubic/leash': Operation not permitted
8
jcubic
chroot: failed to run command ‘ls’: No such file or directory

Chroot内でコマンドを実行するには、このプログラムをchrootで使用できるようにする必要があります(ファイルシステムの/にインストールされているプログラムを使用できないため)。

最も簡単な方法は、/usr/bin/ls/home/kuba/projects/jcubic/leash/usr/bin/にコピーすることです(依存する共有ライブラリldd /usr/bin/lsも必要になります)。

12
Jakuje

別のルートでlsを実行することは可能ですが、lsコマンドとそれが依存するすべてのファイルは、そのルート内に存在する必要があります。 lsコマンドを開始する方法はありません。そのプロセス内でルートを変更します。lsにはこの機能がありません。

Chrootの要点は、ファイルの可視性を特定のディレクトリの下にあるファイルに制限することです。 chroot ~/projects/jcubic/leash lsを実行すると、chrootコマンドは自身のプロセスのルートを変更し(ルートディレクトリの変更は、それを実行するプロセスと、その後に実行されるすべてのプロセスにのみ影響します)、次に検索パス上のディレクトリにあるlsという実行可能ファイル。ルートは現在~/projects/jcubic/leashであるため、実行可能ファイルは~/projects/jcubic/leash/binなどのディレクトリに存在する必要があります。

Chrootに通常のコマンドを備えた通常のシステムが必要な場合は、インストールする必要があります。 debootstrap (Debianシステムをインストールするため)などのツール、またはDocker(chrootされ、他の方法で制限された環境をセットアップする)などのプロビジョニングツールが役立ちます。

lsコマンドだけが必要な場合でも、lsより多くをコピーする必要があります。 lsを実行するには、lsコマンドとそれが依存するすべてのファイルをコピーする必要があります。 lsは動的にリンクされたプログラムであるため、その動的ローダーと、それが依存するすべての動的ライブラリーが必要です。 ldd /bin/lsを実行して、必要な動的ライブラリをリストします。例えば:

mkdir -p bin lib/x86_64-linux-gnu
rsync -a /bin/ls bin/
rsync -a /lib/x86_64-linux-gnu/ lib/x86_64-linux-gnu/
chroot . ls

または、探索するためのより簡単な方法は、静的にリンクされたバイナリ、たとえば BusyBox を取得することです(Debianおよび派生物ではbusybox-staticパッケージとして利用可能)。

cp /bin/busybox .
chroot . ./busybox ls