如何在chroot中执行“ls”命令?

如何在chroot中执行“ls”命令?

我有浏览器外壳皮带我正在 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/lsfrom 复制到 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

相关内容