温馨提示×

centos readdir为何权限拒绝

小樊
43
2026-09-12 01:46:16
栏目: 智能运维

在 CentOS(以及其它 Linux 发行版)里,readdir() 返回 Permission denied(EACCES),通常不是“目录里某个文件没权限”,而是你对这个目录本身没有执行(x)权限,或者路径中某一层目录缺少权限。

下面按常见原因逐一说明。


一、最根本原因:目录需要 x 权限

对目录来说:

  • r(读):可以列目录项(ls 能看到文件名)
  • x(执行):可以进入 / 访问目录内容(readdir 必须)
  • 没有 x → readdir 直接 EACCES

示例:

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

三、SELinux 导致(CentOS 特有重点)

CentOS 默认开启 SELinux,这是非常常见但容易被忽略的原因。

即使:

  • 文件权限是 755
  • 你是 root

SELinux 策略仍可能拒绝访问。

检查:

getenforce
# Enforcing

查看拒绝日志:

ausearch -m avc -ts recent
# 或
tail /var/log/audit/audit.log

常见场景:

  • 自定义目录(如 /data、/srv/mydir)
  • Web 服务 / 程序读取非标准目录

✅ 解决方式(任选):

  1. 修改 SELinux 上下文:
semanage fcontext -a -t var_t '/data(/.*)?'
restorecon -Rv /data
  1. 临时排查:
setenforce 0

(仅用于测试,不建议生产长期关闭)


四、你是普通用户,但目录属主是 root

例如:

drwxr-x--- root root /var/log/nginx

普通用户 readdir → 拒绝

✅ 解决:

  • 用 sudo
  • 或把用户加入对应组并给组权限

五、NFS / 挂载目录特殊情况

如果是:

  • NFS
  • FUSE
  • 容器挂载目录

可能:

  • 服务端拒绝
  • 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

如果你愿意,可以贴:

  • 报错代码(C / Python / Shell)
  • ls -ld 输出
  • 是否 CentOS 7 / 8 / Stream

我可以更精确地告诉你是哪一层权限或 SELinux 拦的。

0 踩