Как выполнить команду «ls» в chroot?

8

У меня есть браузер оболочка поводок и я выполнять команды оболочки в PHP и returing их в браузер , и я только что обнаружил команду корневой , и я хочу работать, например , lsв корневой директории на измененном корне, На самом деле мне нужно бежать bash -c "ls /". Я пытаюсь это (я пытаюсь без sudo, но это не работает):

sudo chroot ~/projects/jcubic/leash ls

но получил ошибку:

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

правильно ли использовать эту команду? Можно ли запустить ls в другом корневом каталоге?

когда я пытаюсь запустить chroot без sudo, я получаю эту ошибку:

chroot: cannot change root directory to '/home/kuba/projects/jcubic/leash': Operation not permitted
jcubic
источник
3
Ты понимаешь, что chrootдолжен делать?
Satō
1
@SatoKatsura Если я правильно понимаю, я меняю /каталог на другой. Нужно ли иметь binв этом каталоге для запуска команд?
jcubic
8
Да: вам нужно chrootзаранее заполнить тюрьму всеми двоичными файлами, которые вы хотите запустить, всеми необходимыми библиотеками и динамическим загрузчиком (если ваша ОС использует его). Также chroot, как вы узнали, может работать только root .
Satō

Ответы:

12
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.

Jakuje
источник
Я нашел эту статью на help.ubuntu.com, как мне запустить chroot, потому что я не могу найти эту информацию. Должен ли я бежать chroot lucid /bin/bash -c "ls /"илиchroot /var/chroot /bin/bash -c "ls /"
Jcubic
@jcubic, это очень зависит от того, чего ты хочешь достичь. Страница руководства для chroot- это хорошее место для начала, когда вы сомневаетесь в синтаксисе. То же самое для других команд ( bash).
Jakuje
5

Можно запустить 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
Жиль "ТАК - перестань быть злым"
источник