在 Debian(以及大多数 Linux 发行版)里,readdir 失败通常不是代码问题,而是文件系统权限 / 挂载 / SELinux+AppArmor 等导致的。下面按“最常见 → 较少见”给你一套排查与解决办法。
readdir() 需要:
ls -ld /path/to/dir
正确示例:
drwxr-xr-x root root /path/to/dir
如果你当前用户不是 owner,也没有 group/other 的 r-x,就会:
perror("readdir");
// Permission denied
✅ 解决:
chmod 755 /path/to/dir
或把用户加入目录所属组:
usermod -aG groupname user
即使目标目录权限正确,父目录没有 x 权限也会导致 readdir 失败。
例如:
/dir1/dir2
如果 dir1 没有 x:
chmod +x /dir1
✅ 快速验证:
sudo -u youruser ls /path/to/dir
[Service]
User=www-data
但目录属于 root,就会失败。
✅ 解决:
SupplementaryGroups=root_squash 会导致 root 被映射成 nobody检查:
mount | grep nfs
✅ 解决:
no_root_squash(不推荐公网)某些程序(如 mysqld, nginx, php-fpm)被 AppArmor 限制。
查看:
aa-status
日志:
dmesg | grep apparmor
✅ 解决:
aa-complain /etc/apparmor.d/usr.sbin.nginx
或写 profile 允许目录访问。
getenforce
如果是 Enforcing:
ls -Z /path
mount | grep "on / "
如果是 ro:
mount -o remount,rw /
或:
fsck -f /dev/sdX
DIR *dir = opendir("/path");
if (!dir) {
perror("opendir");
return 1;
}
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
printf("%s\n", entry->d_name);
}
closedir(dir);
⚠️ 注意:
opendir 失败 ≠ readdir 失败opendir 就 Permission deniedwhoami
ls -ld /path
ls -ld /path/..
sudo -u youruser ls /path
mount | grep path
aa-status
dmesg | tail
如果你愿意,可以把:
errno / perror)发出来,我可以直接帮你定位是哪一层权限问题。