温馨提示×

Debian readdir权限

小樊
34
2026-07-27 23:16:20
栏目: 智能运维

在 Debian(以及大多数 Linux 发行版)中,readdir 本身是一个 系统调用,用于读取目录内容。你提到的“readdir 权限”,通常是指 对目录的访问权限,而不是对某个文件的权限。

下面分几个层面说明。


1. readdir 依赖的权限本质

readdir() 能否成功,取决于 调用进程对“目录”的权限,而不是目录里文件的权限。

  • 要调用 readdir()
    • 必须对目录拥有执行权限 x
    • 通常需要读权限 r

含义:

  • r(read):允许列出目录内容(如 ls
  • x(execute):允许进入目录(如 cd

✅ 正确示例:

drwxr-x---  user group  dir
  • 属主 / 属组成员可 readdir
  • 其他人不行

2. readdir 只能看到“你有权看到的内容”吗?

⚠️ 不是

  • readdir() 会返回目录中 所有文件名
  • 即使你对文件本身没有权限

示例:

drwxr-xr-x user user dir
-rw------- root root dir/secret

普通用户:

readdir("dir")  // 能看到 "secret"
open("dir/secret") // 会失败

✅ 结论:

  • readdir 看的是 目录权限
  • open 看的是 文件权限

3. 常见错误和原因

3.1 readdir 返回 NULL / 失败

常见原因:

  • 目录不存在
  • 没有 x 权限
  • 没有 r 权限
  • 参数错误

错误码:

#include <errno.h>
errno == EACCES   // 权限不足
errno == ENOENT   // 目录不存在

3.2 为什么“进不去目录但能看到文件名”?

不可能。

  • 没有 x 权限 → 不能 opendir() / readdir()
  • 没有 r 权限 → readdir() 失败

4. 实际权限示例

示例 1:可进入但不可列目录

drwx--x--- user user dir
  • ✅ 可 cd dir
  • ❌ 不能 ls dir
  • C 程序中 opendir() 成功,readdir() 失败

示例 2:可列目录但不可进入

drw-r--r-- user user dir
  • ❌ 不能 cd dir
  • opendir() 失败

5. 用户态 vs 内核态

  • readdir() 是 glibc 封装
  • 实际调用的是:
    • getdents() / getdents64()(内核接口)
  • 权限检查在 内核 VFS 层完成

6. 与 ls 的关系

ls dir

本质:

  1. opendir(dir)
  2. readdir()
  3. stat() 获取文件信息(需要文件权限)

⚠️ ls -lls 更容易暴露权限问题


7. 一句话总结

在 Debian 中,readdir 的权限取决于目录的 rx 权限,而不是目录中文件的权限。

如果你有具体场景(比如:

  • C 程序报错
  • Docker / chroot
  • NFS 目录
  • Web 服务(nginx / php)
  • SELinux / AppArmor)

可以贴出具体代码或错误信息,我可以帮你精确分析。

0