access(2)
выполнит полный набор тестов разрешений для вас в ядре:
#include <unistd.h>
#include <stdio.h>
int main(int argc, char* argv[]) {
int i;
for (i=0;i<argc;i++) {
if(access(argv[i], R_OK)) {
printf("%s\n", argv[i]);
perror("R_OK");
}
if(access(argv[i], W_OK)) {
printf("%s\n", argv[i]);
perror("W_OK");
}
}
return 0;
}
Пример вывода:
$ ./foo ./foo /etc/passwd /etc/shadow
/etc/passwd
W_OK: Permission denied
/etc/shadow
R_OK: Permission denied
/etc/shadow
W_OK: Permission denied
РЕДАКТИРОВАТЬ
Обратите внимание, что access(2)
уязвим для условия TOCTTOU Время проверки на время использования.Вы не должны использовать access(2)
для предоставления или запрета доступа к файлам для пользователя из привилегированного процесса, ваша программа будет уязвима для состояния гонки, которое может быть использовано.Если это то, для чего вы хотите выполнить тест, используйте setfsuid(2)
перед выполнением любых вызовов open(2)
или exec*()
.