温馨提示×

ubuntu readdir为何权限拒绝

小樊
49
2026-09-21 20:49:06
栏目: 智能运维

在 Ubuntu(Linux)下调用 readdir() 返回 Permission denied(EACCES),通常不是 readdir() 本身的问题,而是对目录没有访问权限或路径上的某个目录不可穿越。下面按常见原因逐一说明。


一、最常见原因:目录权限不足

readdir() 需要对目录有执行(x)权限,才能进入并读取目录项。

例如:

ls -ld /some/dir
# drwxr----- 2 root root 4096 ...

如果当前用户不是 root,也没有权限:

DIR *d = opendir("/some/dir");
// opendir 可能成功,但 readdir 返回 NULL
// errno = EACCES

✅ 解决:

chmod o+x /some/dir
# 或
sudo chown youruser:youruser /some/dir

二、路径中某一层目录无“执行权限”

即使是目标目录有权限,路径中间的目录也必须可穿越。

例如:

/home/user/private/data/

如果:

drwx------ user user /home/user/private

那么:

opendir("/home/user/private/data");

会失败,因为无法“穿过” private

✅ 解决:

chmod +x /home/user/private

三、SELinux / AppArmor 限制(服务器常见)

即使 ls 能看,程序仍可能被安全模块阻止。

检查:

sudo dmesg | grep denied
sudo aa-status

常见于:

  • Apache / Nginx
  • Docker 容器
  • systemd 服务

✅ 解决(示例):

sudo aa-complain /path/to/binary

四、挂载点问题(NFS / FUSE / 加密目录)

例如:

  • NFS 导出未授权
  • EncFS / eCryptfs 未解锁
  • 网络断开但挂载还在

表现:

readdir -> EACCES

✅ 检查:

mount | grep dir
df -h

五、你打开的是文件而不是目录

opendir("/etc/passwd");  // ❌

虽然 opendir 可能返回非 NULL,但 readdir 会失败。

✅ 正确:

opendir("/etc");

六、程序运行时用户不对(sudo / service)

例如:

  • 你用 sudo 能读
  • 但程序以 www-data 运行就失败

✅ 检查运行用户:

ps aux | grep your_program

七、最小排查清单(推荐)

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

# 2. 看路径每一层
namei -l /path/to/dir

# 3. 看错误
perror("readdir");

总结一句话

Ubuntu 下 readdir 报 Permission denied,99% 是因为“对目录或其父目录缺少 x 权限”。

如果你愿意,可以把:

  • 出错目录
  • 运行用户
  • 相关 C / C++ / Python 代码

贴出来,我可以帮你精确定位。

0 踩