Chroot 找不到 `/bin/bash`

UTF*_*F-8 8 bash chroot

我认为以下内容会起作用:

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/bashdoassudo

$ 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 解释器不存在,或者找不到文件或解释器所需的共享库

所以你去。