Comment exécuter la commande "ls" dans le chroot?

8

J'ai une laisse de shell de navigateur et j'exécute des commandes shell en php et les conserve dans le navigateur et je viens de découvrir la commande chroot et je veux exécuter par exemple lssur le répertoire racine sur la racine modifiée, En fait, je dois exécuter bash -c "ls /". J'ai essayé ceci (j'ai essayé sans sudo mais cela ne fonctionnait pas):

sudo chroot ~/projects/jcubic/leash ls

mais erreur:

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

utiliser cette commande correctement? Est-il possible d'exécuter ls sur un répertoire racine différent?

quand j'ai essayé d'exécuter chroot sans sudo j'ai cette erreur:

chroot: cannot change root directory to '/home/kuba/projects/jcubic/leash': Operation not permitted
jcubic
la source
3
Comprenez-vous ce qui chrootest censé faire?
Satō Katsura
1
@SatoKatsura Si je comprends bien, je change de /répertoire en un autre. Dois-je avoir bindans ce répertoire pour exécuter des commandes?
jcubic
8
Oui: vous devez remplir la chrootprison à l'avance avec tous les fichiers binaires que vous souhaitez exécuter, toutes les bibliothèques dont ils ont besoin et le chargeur dynamique (si votre système d'exploitation en utilise un). Seul root peut également fonctionner chroot, comme vous l'avez découvert.
Satō Katsura

Réponses:

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

Pour exécuter une commande à l'intérieur du chroot, vous devez avoir ce programme disponible dans le chroot (car il ne peut pas utiliser le programme installé dans le /système de fichiers.

Le moyen le plus simple est de copier le /usr/bin/lsde vers /home/kuba/projects/jcubic/leash/usr/bin/(vous aurez également besoin des bibliothèques partagées dépendantes:) ldd /usr/bin/ls.

Jakuje
la source
J'ai trouvé cet article sur help.ubuntu.com, comment dois-je exécuter chroot, car je ne trouve pas ces informations. Dois-je courir chroot lucid /bin/bash -c "ls /"ouchroot /var/chroot /bin/bash -c "ls /"
jcubic
@jcubic tout dépend de ce que vous voulez réaliser. La page de manuel de chrootest un bon point de départ lorsque vous avez des doutes sur la syntaxe. La même chose pour les autres commandes ( bash).
Jakuje
5

Il est possible de s'exécuter lsdans une racine différente, mais la lscommande et tous les fichiers dont elle dépend doivent être présents à l'intérieur de cette racine. Il n'y a aucun moyen de démarrer la lscommande, puis à l'intérieur de ce processus, changez la racine: lsn'a pas cette fonctionnalité.

L'intérêt d'un chroot est de limiter la visibilité des fichiers à ceux sous un certain répertoire. Lorsque vous exécutez chroot ~/projects/jcubic/leash ls, la chrootcommande modifie la racine de son propre processus (la modification du répertoire racine n'affecte que le processus qui le fait et tout processus qu'il exécute ensuite), puis tente d'exécuter un fichier exécutable appelé lsdans un répertoire sur le chemin de recherche. Puisque la racine est maintenant ~/projects/jcubic/leash, l'exécutable doit être présent dans un répertoire tel que ~/projects/jcubic/leash/bin.

Si vous voulez avoir un système normal avec les commandes habituelles dans le chroot, vous devez en installer un. Des outils tels que debootstrap (pour installer un système Debian) ou des outils de provisioning tels que Docker (qui configure un environnement chrooté et confiné d'autres manières) peuvent vous aider.

Si vous voulez juste la lscommande, vous devrez toujours en copier plus que ls. Pour l'exécuter ls, vous devrez copier la lscommande ainsi que tous les fichiers dont elle dépend. Puisqu'il lss'agit d'un programme lié dynamiquement, vous avez besoin de son chargeur dynamique ainsi que de toutes les bibliothèques dynamiques dont il dépend. Exécutez ldd /bin/lspour répertorier les bibliothèques dynamiques requises. Par exemple:

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

Alternativement, une façon plus simple d'explorer est d'obtenir un binaire lié statiquement, par exemple de BusyBox (disponible sur Debian et ses dérivés comme busybox-staticpaquet).

cp /bin/busybox .
chroot . ./busybox ls
Gilles 'SO- arrête d'être méchant'
la source