温馨提示×

ubuntu readdir权限问题为何

小樊
36
2026-10-12 11:24:27
栏目: 智能运维

在 Ubuntu(以及其它 Linux 发行版)里,readdir() 失败或“没权限”通常不是函数本身的问题,而是文件系统权限模型导致的。下面按常见原因系统说明。


一、readdir 的基本权限要求

readdir() 只是读取一个已经打开的目录流,真正决定能不能“看到目录内容”的是:

对目录本身要有执行(x)权限,且通常需要读(r)权限

  • 目录权限示例:
    drwxr-x---  user group  dir/
    
    • r:可以列目录(readdir 能看到文件名)
    • x:可以进入目录(opendir 成功)
    • 没有 x → opendir() 直接失败
    • 没有 r → readdir() 可能返回空或失败

二、最常见的几种“权限问题”

1️⃣ 目录没有执行权限(最常见)

$ ls -ld /some/dir
drw-r--r--  user user /some/dir
  • 有 r 但没 x
  • 结果:
    • opendir() 成功
    • readdir() 失败或返回 NULL
    • errno = EACCES

✅ 解决:

chmod +x /some/dir

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

即使目标目录权限正常:

/srv/data/logs

如果:

drwxr--r-- root root /srv

你仍然无法 opendir("/srv/data/logs")

✅ 解决:

chmod +x /srv

3️⃣ 用户不是目录 owner,也不在 group 中

drwx------ user user dir/

其他用户:

  • opendir() → Permission denied
  • readdir() → 根本拿不到目录流

4️⃣ 在容器 / chroot / 挂载点中

常见情况:

  • Docker 挂载目录
  • NFS / FUSE
  • snap 限制目录访问

例如:

/home/user/data  (NFS, root_squash)

✅ 检查:

mount | grep dir
ls -ld dir

5️⃣ SELinux / AppArmor(Ubuntu 常见是 AppArmor)

Ubuntu 默认启用 AppArmor,例如:

  • nginx
  • mysql
  • snap 应用

即使 ls 能看到,程序调用 readdir() 仍可能被拦。

✅ 检查:

sudo dmesg | grep apparmor
sudo aa-status

6️⃣ 你“能 ls 但程序不能 readdir”

原因可能是:

  • ls 用 sudo
  • 程序以普通用户运行
  • 或程序在沙箱里

三、如何快速排查(实用步骤)

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

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

# 3. 看当前用户
id

# 4. 测试 opendir + readdir
strace -e trace=openat,getdents your_program

四、典型错误 errno 对照

errno 含义
EACCES 权限不足
ENOENT 目录不存在
ENOTDIR 不是目录
EPERM 被安全模块拦截

五、一句话总结

Ubuntu 下 readdir 权限问题,99% 是“目录或其父目录缺少 x 权限”,或受 AppArmor / 用户身份限制。

如果你愿意,可以贴出:

  • 出错目录的 ls -ld
  • 用户身份
  • 是否容器 / 服务程序

我可以帮你精确判断是哪一类问题。

0 踩