温馨提示×

centos readdir如何权限

小樊
43
2026-09-15 06:55:01
栏目: 智能运维

在 CentOS(Linux) 里,readdir() 能不能成功,本质上取决于目录的权限和调用进程的身份。下面从原理、常见权限问题、排查与解决几个方面说明。


一、readdir 依赖什么权限?

readdir() 是读取已经打开的目录流(由 opendir() 返回)。
能否 opendir() 成功,关键看:

1. 目录权限

对目录来说,三种权限含义不同:

权限 对目录的含义
r 可列目录内容(ls、readdir)
w 可增删文件
x 可进入目录(cd、访问子项)

✅ readdir 至少需要:

  • 目录有 r 权限
  • 目录有 x 权限

二、典型错误与原因

1. Permission denied

DIR *dir = opendir("/root");
  • 当前用户不是 root
  • /root 默认权限:drwx------

✅ 解决:

  • 用 root
  • 或改权限(不推荐对系统目录)
chmod 755 /root

2. 能 cd 但不能 ls

drwxr-xr-- 目录
  • 有 x(能进)
  • 无 r(不能列)

❌ readdir 失败


3. SELinux 导致(CentOS 常见)

即使权限正确,也可能失败。

查看:

getenforce

临时排查:

setenforce 0

如确实 SELinux 限制:

ls -Z /path
restorecon -Rv /path

三、如何检查目录权限

ls -ld /path

示例:

drwxr-xr-x 2 user user 4096 ...

含义:

  • owner:rwx
  • group:rx
  • other:rx

四、C 程序中的正确用法

#include <dirent.h>
#include <stdio.h>

int main() {
    DIR *dir = opendir("/tmp");
    if (!dir) {
        perror("opendir");
        return 1;
    }

    struct dirent *entry;
    while ((entry = readdir(dir))) {
        printf("%s\n", entry->d_name);
    }

    closedir(dir);
    return 0;
}

五、常见解决方案总结

✅ 确保:

  1. 目录权限 ≥ r-x
  2. 进程用户有权限
  3. 父目录有 x
  4. SELinux 未拦截

示例修复:

chmod 755 /data
chown appuser:appuser /data

如果你有:

  • 具体路径
  • 报错信息
  • 用户 / 服务(如 nginx、systemd)

我可以帮你精准分析。

0 踩