登录
推荐 文章 Go 技术 课程 下载 专题 AI
首页 >  文章 >  linux

Linux chmod 目录权限为什么不能只看 rwx:搜索权限与逐级遍历

来源:17golang原创

时间:2026-08-27 13:31:53 490浏览 收藏

给共享目录加权限时,最容易出现一种错觉:把目录看成“装文件的普通文件”,然后只盯着 rwx 的字母组合。实际上,目录的 rwx 分别作用于列出目录项、修改目录项和搜索路径;少了中间任一级的搜索权限,目标文件即使本身是 644,也可能返回 EACCES

判断目录访问不能只看最后一个文件的模式位,要从路径起点开始逐级核对搜索权限,再分别验证列目录、创建和读取这几种动作。

要点速览
  • 目录的 x 表示能否搜索并穿过目录,不是“运行目录”。
  • 目录有 w 但没有 x,通常不能有效新增、删除或访问目录项。
  • namei -l 适合看路径每一级,stat 适合确认目标本身的模式和属主。

先把目录权限拆成三个动作

在 Linux 手册里,普通文件的 x 是执行权限,而目录的 x 是搜索权限。为避免把两者混淆,下面把目录上的这个动作写成 x/搜索:它允许进程在该目录中按名字查找下一级,并继续解析更深的路径。目录的 r 更接近“读取目录项列表”,所以能不能执行 ls 与能不能访问一个已知文件,并不是同一个问题。

目录、r、w、x/搜索三种权限与列目录、修改目录项、逐级搜索动作的对应关系

例如,一个目录可以不给普通用户 r,但保留 x。这时用户可能无法列出目录内容,却能在已知完整路径时读取自己有权限读取的文件。反过来,只有 r 没有 x,看到目录名不代表能打开其中的文件。

用一个可复查的目录树验证差异

下面的实验不改系统目录,只在当前用户的临时目录里建立三层路径。目录名固定为 permission-lab/private/report.txt,便于把每次命令输出和路径级权限对应起来。

mkdir -p permission-lab/private
printf 'daily report\n' > permission-lab/private/report.txt
chmod 711 permission-lab
chmod 701 permission-lab/private
chmod 644 permission-lab/private/report.txt
namei -l permission-lab/private/report.txt
stat -c '%A %a %U:%G %n' permission-lab permission-lab/private permission-lab/private/report.txt

预期检查点是:顶层目录和 private 都给了当前用户搜索路径所需的 x,目标文件自身是 644。如果当前用户不是目录属主,还要结合实际的 group/other 权限判断,不能只看数字是否“看起来合理”。

沿路径逐级找出 EACCES 的位置

访问一个路径时,内核会从起点开始处理每一个非末级组件。任一级目录缺少对应身份的搜索权限,路径解析就会停止。这里的关键节点是 namei搜索权限EACCES目标文件:它们对应“逐级展开、检查、失败或抵达”的实际链路。

namei 逐级检查搜索权限,缺少搜索权限返回EACCES,否则抵达目标文件
chmod o-x permission-lab/private
namei -l permission-lab/private/report.txt
cat permission-lab/private/report.txt
chmod o+x permission-lab/private
cat permission-lab/private/report.txt

用没有属主权限的测试账号执行时,第一次 cat 应表现为权限拒绝;恢复目录的搜索权限后,才会到达并读取 report.txt。如果你用 root 执行,传统权限检查可能被超级用户权限或能力绕过,这个实验就失去对比意义。

为什么 w 不能单独解决删除和创建

创建、删除和重命名主要是在目录项上做修改,因此判断时要看目录的 w;但进程还要能搜索目录,才能定位要操作的名字。实际排查时,先看父目录的 wx,再看目标文件或子目录的权限。删除一个文件通常不由该文件自己的写权限决定,这是很多“文件是 444 但仍能被删”的困惑来源。

mkdir permission-lab/inbox
chmod 733 permission-lab/inbox
printf 'keep me\n' > permission-lab/inbox/item.txt
ls -ld permission-lab/inbox
ls -l permission-lab/inbox/item.txt

共享投递目录常用“能放入但不让人互相列举”的思路,但它会带来猜测文件名、清理责任和审计困难。若目录允许多人写入,还应评估 sticky bit、属主分组和应用层命名规则,别把一条 chmod 命令当成完整隔离方案。

把最小权限落到验收清单

  • namei -l /完整路径 检查路径每一级的属主、属组和模式。
  • stat 分别确认目录和目标文件,不把最后一个 644 当成全路径结论。
  • 分别测试“已知文件名读取”“列出目录”“创建/删除目录项”,这三个动作的权限需求不同。
  • 用目标运行用户复测;不要用 root 的成功结果替代服务账号的验收。

常见问题

目录没有 r,为什么已知文件名仍可能能读?

只要路径每一级都有搜索权限,并且目标文件本身允许读取,进程可以按已知名字完成查找;没有 r 主要影响读取目录项列表。

目录有 w 没有 x,为什么创建仍失败?

修改目录项需要写权限,但定位目录项也需要搜索权限。缺少 x 时,路径解析阶段就可能失败。

只改最后一个文件的 chmod 能解决权限拒绝吗?

不一定。应先用 namei -l 找出返回 EACCES 的路径组件,再根据运行用户和实际动作修正最小范围的权限。

总结

目录权限的核心不是记住几组数字,而是把动作拆开:r 影响目录项列表,w 影响目录项修改,x 影响搜索和穿过路径。遇到“文件权限没问题但仍打不开”时,从路径根部逐级检查,通常比反复给目标文件加权限更快,也更安全。

声明:本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>