我认为以下内容会起作用:
mkdir /tmp/chrootTest # Create chroot folder.
mkdir /tmp/chrootTest/bin # Create `/bin` in the chroot folder.
sudo mount -B /bin /tmp/chrootTest/bin/ # Bind-mount the real system's `/bin` to the chroot's `/bin`.
sudo chroot /tmp/chrootTest/ /bin/bash # Execute (open) `/bin/bash` in the chroot.
Run Code Online (Sandbox Code Playgroud)
但是最后一个命令产生:
chroot: failed to run command ‘/bin/bash’: No such file or directory
Run Code Online (Sandbox Code Playgroud)
我也试图复制/bin
到/tmp/chrootTest/bin
,并给予它充分的权限。但是,这也不起作用。
看到一条错误消息通知我/bin/bash
无法在其非常基本的 chroot 中工作,因为找不到其他文件,我不会完全感到惊讶。但是,打印的错误消息令人惊讶,因为该文件显然存在。
为什么会发生这种情况?在 chroot 中成功打开 bash 需要什么?
Kus*_*nda 14
如果/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
Run Code Online (Sandbox Code Playgroud)
相比之下:
$ ldd $( command -v sh )
/bin/sh:
Start End Type Open Ref GrpRef Name
000007ca3c446000 000007ca3c6c6000 dlib 1 0 0 /bin/sh
Run Code Online (Sandbox Code Playgroud)
我在 OpenBSD 上。ldd
在 Linux 系统上输出的格式会有所不同,但在 Linux 上也应该显示相同的基本信息(共享哪些库,以及它们在哪里)。
当我尝试使用仅包含和 (是 OpenBSD 的“替代品”)的非常简单的 chroot 时:/bin/sh
/bin/bash
doas
sudo
$ 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
Run Code Online (Sandbox Code Playgroud)
请注意,我确实得到了一个 shell ( /bin/sh
),但/bin/bash
失败了。该错误与您的不同,但我认为它具有相同的原因。执行/bin/bash
直接用chroot
命令只是给出一个字的“取消”的消息,再一次,大概是由于同与图书馆的问题。
结论: chroot 至少需要包含系统的最小安装,包括在其中运行可执行文件所需的设备文件和库。
Linux 上“没有这样的文件或目录”错误的解释:
我对为什么 Linux 上的错误是“没有这样的文件或目录”感到有些困惑,所以我通过strace
.
execve()
应该执行 shell的调用返回 ENOENT:
execve("/bin/bash", ["/bin/bash"], [/* 13 vars */]) = -1 ENOENT (No such file or directory)
Run Code Online (Sandbox Code Playgroud)
......所以我认为查找有问题/bin/bash
。但是,在阅读execve(2)
手册时,我看到:
ENOENT
文件文件名或脚本或 ELF 解释器不存在,或者找不到文件或解释器所需的共享库。
所以你去。