如何在chroot中执行命令?

3

在我的源代码中,我进行了chroot操作,然后有一些代码执行了某些操作,然后我想执行Linux命令。但是由于我使用chroot更改了根目录,所以该命令无法正常工作。

以下是源代码:

int main(void)
{

    if (chroot("/tmp") < 0)
        printf("error in chroot\n");

        /* some source code doing staffs */

    system("ls > /logloglog.txt"); // command failed

    return 0;
}

如何在chroot环境中执行命令?

或者是否可以退出chroot环境,执行命令,然后再返回chroot环境?

2个回答

3
如果您使用chroot(),您必须考虑自己的行为带来的后果。其中一个主要后果是,许多(大多数、所有)通常可用的命令在没有在chroot()环境中使它们可用的情况下不可用。
正确地完成这项工作并不简单。您可能需要将/dev/bin/etc/usr/lib(以及可能还有其他目录)的某些部分适当地安装到新根目录下。一般情况下,在“chroot() 环境”之外建立符号链接是不起作用的。您必须复制重要内容。所有这些的一个副作用是:/tmp 很少是创建完全操作的chroot()环境的合适位置。您可以在 /tmp 的受限访问子目录中获得权限,但将用户放在/tmp中不能很好地隔离他们与其他用户。
另一个主要可能性:您在执行了chroot()后不给用户访问其他命令。也就是说,您不尝试在您的代码中使用system(),并且您不会让该用户使用shell或shell工具。
换言之,使用chroot()不是一件轻松的事情。要做好这项工作需要非常仔细的思考和准备。
您最好使用容器或某种虚拟机吗?
请使用Google或其他搜索引擎搜索以下术语:
  • 'chroot jail escape'
  • 'chroot jail setup'
  • 'chroot jail vs docker'

是否可以从chroot中退出,然后执行命令,然后再回到chroot

实际上不行。您可以尝试编写一个控制程序,它派生一个子进程进行chroot()并处理材料,然后终止,以便控制程序可以执行其任务(执行命令),然后您可以派生另一个子进程,进入chroot()监狱。但这与当前进程逃脱监狱不同-如果任何程序都可以随意取消其监禁时间并恢复未监禁活动,那么这将使chroot()完全无效。

-1

这个怎么样:

system("chroot /tmp /bin/bash -c \"<COMMAND>\"");

您可以直接使用system运行chroot,并使用-c在/tmp环境中执行命令


1
很可能不存在/tmp/bin/bash/tmp/bin/ls - 如果存在,另一个已经可以工作了! - Antti Haapala -- Слава Україні
好的,tmp和bin/bash之间有空格。第一个/tmp参数指定chroot环境的位置。第二个参数表示应使用/bin/bash来执行命令。 - Daniel Lazar
不是从C代码,而是从控制台运行它可以工作。由于system函数调用终端命令,因此它也可以工作。 - Daniel Lazar
1
你试过了吗?输出是什么? - Antti Haapala -- Слава Україні

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接