在 Ubuntu 里用 opendir() 打开目录时报“权限不够”(通常是 EACCES 错误),本质原因是当前进程对目标目录没有执行(x)权限。可以从下面几个方面排查和解决。
程序里一般会这样判断:
DIR *dir = opendir(path);
if (dir == NULL) {
perror("opendir");
}
如果输出:
opendir: Permission denied
那就是权限问题。
ls -ld /目标目录
示例输出:
drwxr-x--- 2 root root 4096 ...
说明:
d 表示目录rwx:拥有者r-x:所属组---:其他用户(无权限)如果你的程序不是以 root 或目录拥有者运行,就会失败。
sudo ./your_program
⚠️ 不推荐用于长期方案,尤其是服务程序。
给“其他用户”加执行权限(仅进入目录):
sudo chmod o+x /目标目录
或更宽松一点:
sudo chmod 755 /目标目录
注意:
- 目录需要 x 权限 才能
opendir- 需要 r 权限 才能
readdir
sudo usermod -aG 组名 你的用户名
然后:
chmod g+x /目标目录
退出重新登录后生效。
如果是后台程序:
[Service]
User=root
或只给 CAP_DAC_READ_SEARCH 能力(高级用法)。
即使目标目录有权限,父目录也必须至少有 x 权限:
ls -ld / /parent /parent/child
某些目录(如 /home、/proc)可能被限制。
查看:
dmesg | grep apparmor
例如:
mount | grep noexec
或 nosuid,nodev 一般不会影响 opendir。
✅ 推荐:
chmod 750 /目录
chown root:yourgroup /目录
usermod -aG yourgroup user
如果你愿意,可以把:
ls -ld 输出发出来,我可以帮你精确判断。