Wie führe ich den Befehl "ls" in der Chroot aus?

8

Ich habe eine Browser-Shell- Leine und führe Shell-Befehle in PHP aus und speichere sie im Browser. Ich habe gerade den Befehl chroot entdeckt und möchte ihn beispielsweise lsim Stammverzeichnis auf dem geänderten Stamm ausführen bash -c "ls /". Tatsächlich muss ich ihn ausführen . Ich habe es versucht (ich habe es ohne sudo versucht, aber es hat nicht funktioniert):

sudo chroot ~/projects/jcubic/leash ls

habe aber Fehler bekommen:

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

verwende ich diesen Befehl richtig? Ist es möglich, ls in einem anderen Stammverzeichnis auszuführen?

Wenn ich versuche, chroot ohne sudo auszuführen, wird folgender Fehler angezeigt:

chroot: cannot change root directory to '/home/kuba/projects/jcubic/leash': Operation not permitted
jcubic
quelle
3
Verstehst du was chrootzu tun ist?
Satō Katsura
1
@SatoKatsura Wenn ich das richtig verstehe, wechsle ich das /Verzeichnis in ein anderes. Muss ich mich binin diesem Verzeichnis befinden, um Befehle ausführen zu können?
Jcubic
8
Ja, Sie müssen das chrootGefängnis vorher mit allen Binärdateien füllen, die Sie ausführen möchten, allen benötigten Bibliotheken und dem dynamischen Loader (falls Ihr Betriebssystem eine verwendet). chrootWie Sie herausgefunden haben, kann auch nur root ausgeführt werden.
Satō Katsura

Antworten:

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

Um einen Befehl innerhalb der Chroot ausführen zu können, muss dieses Programm in der Chroot verfügbar sein (da es das im /Dateisystem installierte Programm nicht verwenden kann .

Am einfachsten ist es, das /usr/bin/lsvon nach zu kopieren /home/kuba/projects/jcubic/leash/usr/bin/(Sie benötigen auch die abhängigen gemeinsam genutzten Bibliotheken :) ldd /usr/bin/ls.

Jakuje
quelle
Ich habe diesen Artikel auf help.ubuntu.com gefunden. Wie soll ich chroot ausführen, da ich diese Informationen nicht finden kann? Soll ich laufen chroot lucid /bin/bash -c "ls /"oderchroot /var/chroot /bin/bash -c "ls /"
jcubic
@jcubic es kommt sehr darauf an, was du erreichen willst. Die Handbuchseite für chrootist ein guter Ausgangspunkt, wenn Sie Zweifel an der Syntax haben. Das gleiche gilt für andere Befehle ( bash).
Jakuje
5

Es ist möglich, lsin einem anderen Stammverzeichnis auszuführen , aber der lsBefehl und alle Dateien, von denen er abhängt, müssen in diesem Stammverzeichnis vorhanden sein. Es gibt keine Möglichkeit, den lsBefehl zu starten und dann innerhalb dieses Prozesses den Stamm zu ändern: lshat diese Funktion nicht.

Der springende Punkt bei einer Chroot ist, die Sichtbarkeit von Dateien auf diejenigen unter einem bestimmten Verzeichnis zu beschränken. Wenn Sie ausführen chroot ~/projects/jcubic/leash ls, chrootändert der Befehl das Stammverzeichnis seines eigenen Prozesses (das Ändern des Stammverzeichnisses wirkt sich nur auf den Prozess aus, der es ausführt, und auf alle Prozesse, die anschließend ausgeführt werden). Anschließend wird versucht, eine ausführbare Datei auszuführen, die lsin einem Verzeichnis im Suchpfad aufgerufen wird. Da sich das Stammverzeichnis jetzt befindet ~/projects/jcubic/leash, muss die ausführbare Datei in einem Verzeichnis wie z ~/projects/jcubic/leash/bin.

Wenn Sie ein normales System mit den üblichen Befehlen in der Chroot haben möchten, müssen Sie eines installieren. Tools wie Debootstrap (zum Installieren eines Debian-Systems) oder Bereitstellungstools wie Docker (das eine Umgebung einrichtet, die chrootiert und auf andere Weise eingeschränkt ist) können helfen.

Wenn Sie nur den lsBefehl möchten , müssen Sie immer noch mehr als kopieren ls. Zum Ausführen lsmüssen Sie den lsBefehl sowie alle Dateien kopieren, von denen er abhängt. Da lses sich um ein dynamisch verknüpftes Programm handelt, benötigen Sie den dynamischen Loader sowie alle dynamischen Bibliotheken, von denen es abhängt. Ausführen, ldd /bin/lsum die erforderlichen dynamischen Bibliotheken aufzulisten. Zum Beispiel:

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

Alternativ können Sie einfacher eine statisch verknüpfte Binärdatei abrufen, z. B. BusyBox (verfügbar für Debian und Derivate als busybox-staticPaket).

cp /bin/busybox .
chroot . ./busybox ls
Gilles 'SO - hör auf böse zu sein'
quelle