2012-03-15 71 views
2

我知道在linux下使用命令「chroot」需要一些文件或目錄,如usr,bin等等。但是當我在C中使用函數chroot()時,是否需要這些文件?如何在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; 
} 
+0

那麼它做了什麼,而不是打印「Hello World」? – 2012-03-15 07:58:11

回答

4

execvp是最有可能失敗,可能與ENOENT: no such file or directory,如果hw.out是一個動態鏈接的可執行文件。

爲了達到這個目的,hw.out所需的所有庫需要在chroot ed環境中找到。

嘗試鏈接hw.out靜態,它應該工作。 (並且在execvp之後添加錯誤檢查以查看在呼叫之後如果返回,則errno設置爲什麼。)

+0

謝謝!我只是想出了它。 hw.out確實需要一些庫,因爲我動態編譯它。編譯後它是靜態的,它的工作原理! – 2012-03-15 08:09:25

1

請測試您的hw.out與命令行chroot一起使用。

也許hw.out動態鏈接,缺少chroot目錄中的一些庫或ld-linux.so

Nitpicks 1,在execvp之後return 0有什麼意義?除非出現錯誤,否則它不會執行。我寧願有perror("can't exec"); return 1;

雞蛋裏挑骨頭2的chroot()不改變工作目錄,雖然它在你的情況,因爲你是Chroot環境到".",它不會如您所願,如果你以後它改變工作的chroot( 「somedir」)。

+0

謝謝!我應該使用chdir(「\\」)來更改工作目錄。你是對的,我動態編譯hw.out並沒有庫。 – 2012-03-15 08:11:26

+0

你應該使用'chdir'和'chroot'具有相同的絕對路徑,並且在它之前。 Linux路徑不使用反斜槓作爲目錄分隔符,而是使用正斜槓。 – 2012-03-15 08:49:44

+0

並學會在自己的二進制文件和現有的可執行文件上使用'strace',以瞭解他們正在執行的系統調用。 – 2012-03-15 08:52:15

0

確保hw.out是正確的直接。如果使用庫,靜態鏈接可能更容易。否則,需要在chroot之後啓用它才能訪問動態庫。