我有浏览器外壳皮带我正在 php 中执行 shell 命令并将它们返回到浏览器,我刚刚发现了 chroot 命令,我想ls
在更改后的 root 上的根目录上运行,事实上我需要运行bash -c "ls /"
.我尝试过这个(我尝试过不使用 sudo 但它不起作用):
sudo chroot ~/projects/jcubic/leash ls
但出现错误:
chroot: failed to run command ‘ls’: No such file or directory
我正确使用这个命令吗?是否可以在不同的根目录上运行 ls ?
当我尝试在不使用 sudo 的情况下运行 chroot 时,出现以下错误:
chroot: cannot change root directory to '/home/kuba/projects/jcubic/leash': Operation not permitted
答案1
chroot: failed to run command ‘ls’: No such file or directory
要在 chroot 中运行任何命令,您需要在 chroot 中提供该程序(因为它不能使用安装在/
文件系统中的程序)。
最简单的方法是将/usr/bin/ls
from 复制到 to /home/kuba/projects/jcubic/leash/usr/bin/
(您还需要依赖的共享库:)ldd /usr/bin/ls
。
答案2
可以ls
在不同的根目录中运行,但ls
命令及其依赖的所有文件必须存在于该根目录中。无法启动该ls
命令,然后在该进程内更改根:ls
没有此功能。
chroot 的全部目的是将文件的可见性限制为某个目录下的文件。当您运行 时chroot ~/projects/jcubic/leash ls
,该chroot
命令会更改其自身进程的根目录(更改根目录仅影响执行此操作的进程以及它随后运行的任何进程),然后尝试运行ls
在搜索路径上的目录中调用的可执行文件。由于现在是根目录~/projects/jcubic/leash
,因此可执行文件必须存在于诸如~/projects/jcubic/leash/bin
.
如果您想在 chroot 中拥有一个正常的系统并使用常用命令,则需要安装一个。工具如反引导程序(安装 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
或者,一种更简单的探索方法是获取静态链接的二进制文件,例如忙碌盒(在 Debian 及其衍生产品上以busybox-static
软件包形式提供)。
cp /bin/busybox .
chroot . ./busybox ls