Как войти в среду chroot из C? - PullRequest
       22

Как войти в среду chroot из C?

5 голосов
/ 16 октября 2010

я пытаюсь заставить мою программу войти в среду 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, но не будет запускать func2, пока я не выйду из среды chroot. Что мне нужно, это заставить мой код выполнять func1, а затем func2 в среде chroot и затем завершать работу. Я знаю, что я делаю в своем коде, это ужасно неправильно, однако, я надеюсь, что смогу получить некоторые указания.

Любая помощь будет высоко ценится.

Ответы [ 2 ]

8 голосов
/ 16 октября 2010

Если вы находитесь в 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;
}

Обратите внимание, что если вы не установите текущую директорию до chroot, можно выйти из chroot.

1 голос
/ 16 октября 2010

Системный вызов chroot делает то, что вы хотите. Фактически, утилита командной строки chroot сама использует это сначала, а затем порождает оболочку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...