Как использовать функцию chroot в C-программировании? - PullRequest
2 голосов
/ 15 марта 2012

Я знаю, что для использования команды "chroot" в linux нужны некоторые файлы или каталоги, такие как usr, bin и так далее. Но когда я использую функцию chroot() в C, мне нужны эти файлы?

Вот мой код, который представляет собой двоичный файл 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;
}

Ответы [ 3 ]

4 голосов
/ 15 марта 2012

execvp, скорее всего, сбой, вероятно, с ENOENT: no such file or directory, если hw.out - динамически связанный исполняемый файл.

Чтобы это работало, все библиотеки, необходимые для hw.out, должны быть доступны в среде chroot ed.

Попробуйте связать hw.out статически, и оно должно работать. (И добавьте проверку ошибок после execvp, чтобы увидеть, что errno установлено после вызова, если он вернется.)

1 голос
/ 15 марта 2012

Пожалуйста, проверьте, что ваш hw.out работает с chroot командной строки.

Возможно, hw.out динамически связан и не содержит некоторых библиотек или ld-linux.so в каталоге chroot.

Nitpicks 1, какой смысл return 0 после execvp? он никогда не будет выполнен, если не будет ошибки. Я бы предпочел perror("can't exec"); return 1;

Nitpick 2, chroot () не меняет рабочий каталог, хотя он работает в вашем случае, так как вы выполняете chroot на ".", он не будет работать так, как вы ожидаете, если позже вы измените его на chroot ("somedir «).

0 голосов
/ 15 марта 2012

Убедитесь, что hw.out в правильном прямом направлении.Возможно, проще статически связать его, если он использует библиотеки.В противном случае после chroot необходимо включить доступ к динамическим библиотекам.

...