Я пытаюсь заставить свой код работать под chroot('/root/test1')
, но он работает неправильно.
Но когда я удалю chroot('/root/test1')
и изменю execl("/test2", "test2", NULL)
на execl("/root/test1/test2", "test2", NULL)
, все будет работать очень хорошо, как и ожидалось. Почему это?
Кроме того, я хотел бы спросить, если я установлю перенаправление fp
на stdin
, а затем использую функцию execl
для работы с другой программой, дочерняя программа получит ввод в fp
или нет?
Файл в '/root/test1/':
test2
test2.cpp
test3
test3.cpp
Значение, возвращаемое функцией execl, равно -1, а errno равно 2.
test3.cpp
int main() {
FILE *fp;
errno = 0;
fp = fopen("log.txt", "r");
dup2(fileno(fp), fileno(stdin));
cout << chdir("/root/test1") << endl;
cout << chroot("/root/test1") << endl;
DIR *dir = opendir("/");
dirent *list;
while ((list = readdir(dir)) != NULL) {
cout << list -> d_name << " ";
}
cout << endl;
closedir(dir);
errno = 0;
cout << execl("/test2", "test2", NULL) << endl;
cout << errno << endl;
cout << strerror(errno) << endl;
return 0;
}
test2.cpp
#include <cstdio>
#include <iostream>
using namespace std;
int main() {
int a,b;
cin >> a;
scanf("%d",&b);
cout << a+b << endl;
printf("%d",a+b);
return 0;
}
log.txt
111 222
вывод*
0
0
. test3.cpp test3 .. test2 test2.cpp log.txt
-1
2
No such file or directory
test2
? Это исполняемый файл? Сценарий оболочки? Связывается ли он с общими библиотеками? Каков результатldd test2
? Копируются ли эти общие библиотеки в/root/test1
? - person KamilCuk   schedule 21.08.2019chroot
. Вы работаете как root? - person molbdnilo   schedule 21.08.20192
— это ошибкаENOENT
, означающая, чтоexecl
не может найти программу. Используйте, например.strerror(errno)
, чтобы напечатать строку с кратким объяснением ошибки. - person Some programmer dude   schedule 21.08.2019errno
нетронутым, а некоторые сбрасывают его в нормальное состояние. - person Thomas Jager   schedule 21.08.2019errno
после вызова не определено, если нет ошибки. Вам нужно проверить, что на самом деле возвращают функции, чтобы увидеть, завершаются ли они неудачно или успешно. Только в случае сбоя функции вы должны проверить значениеerrno
и получить (и, возможно, сохранить во временной переменной) как можно скорее (до того, как другая функция может изменить его). - person Some programmer dude   schedule 21.08.2019chroot
возвращает? Вы должны проверить, что это удается. Что произойдет, если это не удастся? Прямо сейчас, с кодом, который вы показываете, вы не проверяете это. Вам нужно сделать что-то вродеif (chroot(...) == -1) { perror("chroot"); return 1; }
- person Some programmer dude   schedule 21.08.2019