在 CentOS(以及其它 Linux 发行版)里,readdir() 返回 Permission denied(EACCES),通常不是“目录里某个文件没权限”,而是你对这个目录本身没有执行(x)权限,或者路径中某一层目录缺少权限。
下面按常见原因逐一说明。
x 权限对目录来说:
r(读):可以列目录项(ls 能看到文件名)x(执行):可以进入 / 访问目录内容(readdir 必须)示例:
drwxr--r-- 2 root root 4096 dir
ls dir 看到文件名readdir(dir) → Permission denied✅ 解决:
chmod o+x dir
# 或
chmod 755 dir
即使目标目录有权限,中间任一层目录没有 x 权限都会导致失败。
例如:
/home/user/data/logs
如果:
drwx------ user user /home/user
那其他用户访问 /home/user/data 时就会:
readdir → EACCES
✅ 检查方式:
namei -l /path/to/dir
CentOS 默认开启 SELinux,这是非常常见但容易被忽略的原因。
即使:
SELinux 策略仍可能拒绝访问。
检查:
getenforce
# Enforcing
查看拒绝日志:
ausearch -m avc -ts recent
# 或
tail /var/log/audit/audit.log
常见场景:
/data、/srv/mydir)✅ 解决方式(任选):
semanage fcontext -a -t var_t '/data(/.*)?'
restorecon -Rv /data
setenforce 0
(仅用于测试,不建议生产长期关闭)
例如:
drwxr-x--- root root /var/log/nginx
普通用户 readdir → 拒绝
✅ 解决:
sudo如果是:
可能:
root_squash 导致权限变化错误示例:
opendir("/path");
readdir(); // EACCES
确认:
opendir() 成功readdir() 或 closedir()errno == EACCES# 1. 查权限
ls -ld /path /path/to /path/to/dir
# 2. 查路径权限链
namei -l /path/to/dir
# 3. 查 SELinux
getenforce
ausearch -m avc -ts recent
# 4. 用 root 测试
sudo readdir_test
如果你愿意,可以贴:
ls -ld 输出我可以更精确地告诉你是哪一层权限或 SELinux 拦的。