在 Debian(以及其它 Linux 发行版)里,readdir 返回 权限不足(EACCES),通常不是 readdir 本身的问题,而是目录的访问权限或挂载/安全机制导致的。下面按常见原因逐一说明。
对目录来说:
如果目录没有 x 权限,readdir 会失败:
readdir(fd); // errno = EACCES
示例:
drw-r--r-- 2 root root 4096 xxx dir
# 缺少 x 权限
修复:
chmod +x dir
即使目标目录有权限,父目录没有 x 权限也会导致失败:
/home/user/secret/
如果:
drwxr-x--- root root /home/user
普通用户无法进入 user,自然无法 readdir secret
典型场景:
/var/log/
/root/
/etc/something/
即使目录是 755,如果你不是 owner 且不在组中,某些特殊配置也可能受限。
Debian 默认启用 AppArmor,可能限制程序访问目录。
例如:
被限制后,readdir 会返回 EACCES
查看:
sudo aa-status
日志:
sudo dmesg | grep apparmor
某些挂载方式会限制访问:
mount | grep dir
常见:
ro(只读,但一般不是 EACCES)noexec(不影响 readdir)nodev如果你用:
open(path, O_RDONLY | O_DIRECTORY);
readdir(fd);
而:
x也会 EACCES
在:
中,即使宿主机有权限,容器内也可能:
如:
服务器端权限不足,客户端 readdir 就失败。
strace -e trace=openat,getdents,readdir your_program
namei -l /path/to/dir
id
sudo -u nobody your_program
| errno | 含义 |
|---|---|
| EACCES | 权限不足 |
| ENOENT | 路径不存在 |
| ENOTDIR | 不是目录 |
| EPERM | 操作不允许 |
如果你愿意,可以把:
ls -ld 输出发出来,我可以帮你精确判断是哪一类原因。