Если / bin / bash
является двоичным файлом с зависимостями разделяемых библиотек, эти зависимости должны быть разрешены внутри chroot.
В моей системе:
$ ldd $( command -v bash )
/usr/local/bin/bash:
Start End Type Open Ref GrpRef Name
0000115f08700000 0000115f08a0c000 exe 1 0 0 /usr/local/bin/bash
00001161f6a2e000 00001161f6c88000 rlib 0 1 0 /usr/lib/libtermcap.so.14.0
00001161bc41e000 00001161bc629000 rlib 0 1 0 /usr/local/lib/libintl.so.6.0
000011614b1de000 000011614b4dd000 rlib 0 2 0 /usr/local/lib/libiconv.so.6.0
00001161bd091000 00001161bd35b000 rlib 0 1 0 /usr/lib/libc.so.89.2
000011612ef00000 000011612ef00000 rtld 0 1 0 /usr/libexec/ld.so
В отличие от:
$ ldd $( command -v sh )
/bin/sh:
Start End Type Open Ref GrpRef Name
000007ca3c446000 000007ca3c6c6000 dlib 1 0 0 /bin/sh
Я использую OpenBSD. Формат вывода ldd
будет отличаться в системе Linux, но та же самая важная информация (какие библиотеки используются совместно и где они) также должна отображаться в Linux.
Когда я пытаюсь использовать очень упрощенный chroot, который содержит только / bin / sh
и / bin / bash
( doas
- это OpenBSD " sudo
replace"):
$ doas chroot -u kk t /bin/sh
/bin/sh: No controlling tty (open /dev/tty: No such file or directory)
/bin/sh: warning: won't have full job control
$ /bin/bash
Abort trap
Обратите внимание, что я получил оболочку ( / bin / sh
), но / bin / bash
не работает. Ошибка отличается от вашей, но, как я полагаю, имеет ту же причину. Выполнение / bin / bash
напрямую с помощью команды chroot
просто дает однословное сообщение «Прервать», опять же, предположительно из-за той же проблемы с библиотеками.
Заключение: chroot должен содержать хотя бы минимальную установку системы, включая файлы устройств и библиотеки, необходимые для запуска исполняемых файлов в ней.
Объяснение ошибки «Нет такого файла или каталога» в Linux:
Я был немного сбит с толку, почему в Linux возникла ошибка «Нет такого файла или каталога», поэтому я провел тест через strace
.
Вызов execve ()
, который должен был запустить оболочку, возвращает ENOENT:
execve("/bin/bash", ["/bin/bash"], [/* 13 vars */]) = -1 ENOENT (No such file or directory)
... так что я подумал, что что-то не так с нахождением / bin / bash
. Однако, прочитав руководство execve (2)
, я увидел:
ENOENT
Имя файла файла или скрипт или интерпретатор ELF не существует, или общая библиотека, необходимая для файла или переводчик не найден .
Итак, поехали.