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

Более простая серия операторов оболочки для разделения связанного DjVU:

mkdir -- 'mydoc/' &&
djvmcvt -i 'mydoc.djvu' 'mydoc/' 'new-mydoc-index.djvu'
8
10.06.2017, 12:19
2 ответа
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).

13
27.01.2020, 20:09

Можно запустить 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
6
27.01.2020, 20:09

Теги

Похожие вопросы