温馨提示×

centos readdir为何权限不足

小樊
46
2026-10-20 16:47:49
栏目: 智能运维

在 CentOS 下调用 readdir() 返回“权限不足”(通常是 errno == EACCES),并不是 readdir() 本身的问题,而是目录或路径的访问权限不足。下面按常见原因逐一说明。


一、readdir 权限的本质

readdir() 只能读取已经成功 open 的目录流(DIR *)。

要成功 opendir() + readdir(),必须满足:

  1. 对目录有执行权限(x)
  2. 对目录有读权限(r)

否则:

  • opendir() 失败 → errno = EACCES
  • 或 readdir() 返回 NULL,errno = EACCES

二、CentOS 常见原因

1️⃣ 目录权限不足(最常见)

ls -ld /some/dir

如果看到:

drwx------ root root /some/dir

那么:

  • 非 root 用户 无法进入
  • readdir() 会报权限不足

✅ 解决:

chmod 755 /some/dir

2️⃣ 父目录没有执行权限(x)

即使目标目录权限正常,父目录也要有 x 权限。

例如:

/srv/data/logs

如果 /srv/data 是:

drwxr--r-- root root

缺少 x,则无法访问 logs

✅ 解决:

chmod 755 /srv /srv/data

3️⃣ SELinux 限制(CentOS 特有 ⚠️)

CentOS 默认开启 SELinux,即使 ls -l 显示权限正常,也可能被拦截。

查看是否有 SELinux 拒绝:

sudo ausearch -m avc -ts recent

或临时验证:

setenforce 0

如果关闭后正常 → 就是 SELinux 策略问题

✅ 解决方式:

  • 修改 SELinux 上下文
  • 或写策略放行

4️⃣ 程序以非 root 用户运行

例如:

  • Nginx / Apache / systemd service
  • Docker 容器

即使你是 root 登录,程序可能不是 root

查看运行用户:

ps -ef | grep your_program

✅ 解决:

  • 用正确用户运行
  • 或给目录授权

5️⃣ 挂载目录权限问题(NFS / SMB)

如果是:

  • NFS
  • Samba
  • 容器挂载卷

可能出现:

  • 服务器端权限限制
  • root_squash
  • UID 映射不一致

✅ 检查:

mount | grep dir

6️⃣ 符号链接指向无权限目录

dir -> /protected/secret

即使 dir 权限正常,真实目录无权限也不行


三、快速排查 checklist

# 1. 看目录权限
ls -ld /path

# 2. 看父目录
namei -l /path

# 3. 看 SELinux
getenforce
ausearch -m avc

# 4. 看程序用户
ps -ef | grep app

四、示例错误代码对照

DIR *d = opendir("/data");
if (!d) {
    perror("opendir");
}

输出:

opendir: Permission denied

→ 100% 是 目录访问权限问题


如果你愿意,可以贴:

  • 错误代码
  • ls -ld 输出
  • 是否 CentOS 7 / 8 / Stream
  • 是否容器 / systemd

我可以帮你精准定位。

0 踩