【问题标题】:How to use chroot function in C programming?如何在 C 编程中使用 chroot 函数?
【发布时间】:2012-03-15 07:55:35
【问题描述】:

我知道在linux中使用命令“chroot”需要一些文件或目录,如usrbin等。但是当我在C中使用函数chroot()时,我需要这些文件吗?

这是我的代码,“hw.out”是一个二进制文件,只打印“Hello, world”。我编译它并以 root 身份运行它,但无法打印“Hello, world”。我还应该做什么?谢谢!

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    int result = chroot(".");

    if(result == 0)
        printf("Chroot Succese.\n");

    char *arrays[]={"./hw.out",NULL};
    execvp("./hw.out", arrays);
    return 0;
}

【问题讨论】:

  • 那么它做了什么而不是打印“Hello World”?

标签: c linux chroot


【解决方案1】:

execvp 很可能失败,如果 hw.out 是动态链接的可执行文件,则可能与 ENOENT: no such file or directory 一起失败。

为此,hw.out 所需的所有库都需要在 chrooted 环境中找到。

尝试静态链接hw.out,它应该可以工作。 (并在execvp 之后添加错误检查,以查看调用后errno 在返回时设置的内容。)

【讨论】:

  • 谢谢!我刚刚想通了。 hw.out 确实需要一些库,因为我是动态编译的。静态编译后,就可以了!
【解决方案2】:

请测试您的 hw.out 是否可以与命令行 chroot 一起使用。

也许 hw.out 是动态链接的,并且在 chroot 目录中缺少一些库或 ld-linux.so

Nitpicks 1,execvp 之后return 0 的意义何在?除非出现错误,否则它永远不会被执行。我宁愿perror("can't exec"); return 1;

Nitpick 2,chroot() 不会更改工作目录,尽管它适用于您的情况,因为您正在 chrooting 到 ".",如果您稍后将其更改为 chroot("somedir ")。

【讨论】:

  • 谢谢!我应该使用 chdir("\\") 来更改工作目录。你是对的,我动态编译 hw.out 并且没有库。
  • 您应该使用chdirchroot 之前的绝对路径。 Linux 路径不使用反斜杠作为目录分隔符,而是使用正斜杠。
  • 并学习在您自己的二进制文件和现有可执行文件上使用strace,以了解它们正在执行的系统调用。
  • 非常感谢。我会试试的。
【解决方案3】:

确保 hw.out 是正确的。如果它使用库,可能更容易将其静态链接。否则需要在chroot后开启才能访问动态库。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-23
    • 1970-01-01
    • 2021-01-01
    相关资源
    最近更新 更多