如何从C进入chroot环境?

我试图做的是让我的程序进入chroot环境并执行一些命令,然后退出。

例如

#include <stdlib.h> #include <stdio.h> #include <string.h> #define ChRoot "sudo chroot \"/\" /usr/bin/env -i HOME=/root TERM=\"$TERM\" PATH=/bin:/usr/bin:/sbin:/usr/sbin:/bin /bin/bash --login +h" void func1(){ //enter the chroot environment char line[130]; FILE *fp; fp = popen(ChRoot, "r"); while(fgets( line, sizeof line, fp)){ printf ("%s\n",line); } pclose(fp); } void func2(){ //run a command in the chroot environment char line[130]; FILE *fp; fp = popen("ls", "r"); while(fgets( line, sizeof line, fp)){ printf ("%s\n",line); } pclose(fp); } int main() { func1(); func2(); return 0; } 

这个代码的问题是,它会让我在chroot环境中,但是直到我退出chroot环境,它才会激发func2。 我需要的是让我的代码在chroot环境中执行func1然后func2,然后退出。我知道我在代码中做什么是可怕的错误,但是,我希望我可以得到一些方向。

任何帮助将非常感激。

如果你在C中,并且你想输入一个chroot,你可以直接使用chroot()函数:

 #include <stdio.h> #include <unistd.h> int main(void) { FILE *f; /* chroot */ chdir("/tmp"); if (chroot("/tmp") != 0) { perror("chroot /tmp"); return 1; } /* do something after chrooting */ f = fopen("/etc/passwd", "r"); if (f == NULL) { perror("/etc/passwd"); return 1; } else { char buf[100]; while (fgets(buf, sizeof(buf), f)) { printf("%s", buf); } } return 0; } 

请注意,如果您在chrooting之前没有设置当前目录,则有可能脱离chroot。

有一个chroot系统调用,可以做你想做的事情。 事实上, chroot命令行实用程序本身首先使用它,然后生成一个shell。