在 Debian(或者说 Linux 通用)里,readdir 本身不负责权限检查,它只是读取目录项(dirent)。权限是在“打开目录”这一步由内核检查的。下面按常见问题和正确处理方式说明。
使用 opendir() 打开目录时,内核会检查:
示例:
DIR *dir = opendir("/some/dir");
if (!dir) {
perror("opendir");
// EACCES: 权限不足
// ENOENT: 目录不存在
}
✅ 权限问题 90% 出在 opendir,而不是 readdir
即使 opendir 成功:
readdir 能列出文件名例如:
struct dirent *de;
while ((de = readdir(dir)) != NULL) {
printf("%s\n", de->d_name);
}
如果后续调用:
stat(de->d_name, &st);
可能会失败(权限不足)。
| 错误 | 含义 |
|---|---|
EACCES |
对目录无 x 权限 |
ENOENT |
路径不存在 |
EPERM |
受 MAC 限制(AppArmor 等) |
ELOOP |
符号链接循环 |
DIR *dir = opendir(path);
if (!dir) {
if (errno == EACCES)
fprintf(stderr, "无权限访问目录: %s\n", path);
return;
}
struct dirent *de;
while ((de = readdir(dir))) {
if (stat(de->d_name, &st) == -1) {
if (errno == EACCES)
continue; // 跳过无权限文件
}
}
sudo ./your_program
setuid(uid);
setcap cap_dac_read_search+ep ./your_program
这样可以在不 root 的情况下读取目录。
Debian 默认可能限制程序访问某些目录(如 /home):
aa-status
readdir 不解析符号链接,但 stat 会。
readdir 不处理权限,权限在 opendir 和 stat 阶段处理;遇到 EACCES 就说明没权限,不要忽略。
如果你愿意,可以:
我可以给你更针对性的建议。