2

usrLinuxで「chroot」コマンドを使用するには、などのファイルまたはディレクトリが必要であることを知っていますbin。しかしchroot()、C で関数を使用する場合、これらのファイルは必要ですか?

これが私のコードです。「hw.out」は「Hello、world」を出力するバイナリファイルです。コンパイルしてルートとして実行しましたが、「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;
}
4

3 に答える 3

4

execvpが動的にリンクされた実行可能ファイルであるENOENT: no such file or directory場合、おそらく で失敗する可能性が最も高いです。hw.out

それが機能するためには、必要なすべてのライブラリがed 環境hw.outで見つけられる必要があります。chroot

hw.out静的にリンクしてみてください。うまくいくはずです。(そして、呼び出しが戻った場合にexecvp何が設定されているかを確認するために、後にエラー チェックを追加します。)errno

于 2012-03-15T08:05:33.737 に答える
1

hw.outコマンドライン chroot で動作することをテストしてください。

おそらく、hw.out が動的にリンクされていて、一部のライブラリが欠落しているかld-linux.so、chroot ディレクトリにない可能性があります。

ちょっとしたこと 1、execvpreturn 0後のポイントは何ですか? エラーがない限り実行されません。私はむしろ持っているだろうperror("can't exec"); return 1;

Nitpick 2、chroot() は作業ディレクトリを変更しませんが、あなたのケースでは機能しますが、"."後で chroot("somedir") に変更すると、期待どおりに機能しません。

于 2012-03-15T08:07:51.310 に答える
0

hw.outが正しいダイレクトにあることを確認してください。ライブラリを使用している場合は、静的にリンクした方が簡単かもしれません。それ以外の場合は、chroot 後に動的ライブラリにアクセスできるようにする必要があります。

于 2012-03-15T08:10:52.320 に答える