我正在尝试让 chroot 在我的 mac book 上工作。我将 jail 目录设置为包含/bin/sh 和/bin/bash(递归称为/usr/bin/otool)的所有要求
# ls /var/chroot/*/*
/var/chroot/bin/bash /var/chroot/bin/sh
/var/chroot/usr/lib:
libDiagnosticMessagesClient.dylib libauto.dylib
libc++abi.dylib libobjc.A.dylib
libSystem.B.dylib libc++.1.dylib
libncurses.5.4.dylib system
当我尝试在/var/chroot 上使用 chroot 时,它一直说找不到/bin/bash
# chroot /var/chroot/
chroot: /bin/sh: No such file or directory
$ sudo chroot /var/chroot/
chroot: /bin/bash: No such file or directory
知道是什么导致 chroot 无法在我的 Mac 上工作吗?
操作系统版本 10.8.4
编辑: 在 CentOS 上,当我运行 ldd/bin/bash 时,我得到了所有需要的库。如果我不全部复制它们,它会显示/bin/bash: No such file or directory。所以我认为这意味着在 Mac 上我缺少库;只是不确定是哪个。
最佳答案
您需要将 /usr/lib/dyld
复制到您的 chroot jail 以获得动态链接器。如果不存在,则尝试在 chroot jail 中执行任何操作都会失败,除了 Killed: 9
之外不会出现任何错误。一旦你复制了 /usr/lib/dyld
,那么如果你缺少任何进一步的库,你将得到一个错误,例如:
dyld: Library not loaded: /usr/lib/libncurses.5.4.dylib
Referenced from: /bin/bash
Reason: image not found
从你的文件列表中我看到你没有/usr/lib/dyld
,所以我认为这很可能是你的问题。对于这个问题,我不确定为什么您得到的是 No such file or directory
而不是 Killed: 9
;可能这是操作系统版本差异 - 我在 Mac OS X 10.10.5 上测试,你正在(或曾经)在 Mac OS X 10.8.4 上测试。
hwatkins 的回答当然有效,因为它复制了 /usr/lib/dyld
和运行 /bin/bash
所需的每个 dylib 到 jail 。但是,在设置 jail 时,我更喜欢只复制最低限度的文件以使其正常工作。一旦你复制了
dyld 和 bash,您可以按照错误消息获取所需的所有其他库的路径。 (有点费力,但这是保证的最低限度。)
递归调用otool -L
的方法也适用于*.dylib文件,但它不会告诉你/usr/lib/dyld
。这是因为 -L
打印使用的共享库,但 /usr/lib/dyld
不完全是共享库。如果您在可执行库上运行 otool -l
,您将看到 -L
输出匹配加载命令 LC_LOAD_DYLIB
(以及一些变体例如LC_REEXPORT_DYLIB
),而对dyld
的引用在LC_LOAD_DYLINKER
中,它不是由-L
输出的。
关于linux - OSX 和 chroot 无法找到/bin/bash,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19262649/