Linux chmod 目录权限为什么不能只看 rwx:搜索权限与逐级遍历
来源:17golang原创
时间:2026-08-27 13:31:53 490浏览 收藏
给共享目录加权限时,最容易出现一种错觉:把目录看成“装文件的普通文件”,然后只盯着 rwx 的字母组合。实际上,目录的 r、w、x 分别作用于列出目录项、修改目录项和搜索路径;少了中间任一级的搜索权限,目标文件即使本身是 644,也可能返回 EACCES。
判断目录访问不能只看最后一个文件的模式位,要从路径起点开始逐级核对搜索权限,再分别验证列目录、创建和读取这几种动作。
- 目录的
x表示能否搜索并穿过目录,不是“运行目录”。 - 目录有
w但没有x,通常不能有效新增、删除或访问目录项。 namei -l适合看路径每一级,stat适合确认目标本身的模式和属主。
先把目录权限拆成三个动作
在 Linux 手册里,普通文件的 x 是执行权限,而目录的 x 是搜索权限。为避免把两者混淆,下面把目录上的这个动作写成 x/搜索:它允许进程在该目录中按名字查找下一级,并继续解析更深的路径。目录的 r 更接近“读取目录项列表”,所以能不能执行 ls 与能不能访问一个已知文件,并不是同一个问题。

例如,一个目录可以不给普通用户 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 和 目标文件:它们对应“逐级展开、检查、失败或抵达”的实际链路。

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 影响搜索和穿过路径。遇到“文件权限没问题但仍打不开”时,从路径根部逐级检查,通常比反复给目标文件加权限更快,也更安全。
-
426 收藏
-
387 收藏
-
242 收藏
-
238 收藏
-
402 收藏
-
文章 · linux | 12分钟前 | 定时任务 · 任务调度 · linux运维 · 故障排查 · 服务管理 · Linux 定时任务 OnCalendar Persistent Linux 定时单元375 收藏
-
文章 · linux | 2小时前 | Linux · 日志排查 · journalctl · 服务管理器 · 故障定位 · Linux 时区 journalctl --since --until 日志时间窗口134 收藏
-
208 收藏
-
293 收藏
-
126 收藏
-
482 收藏
-
189 收藏
-
301 收藏
-
489 收藏
-
304 收藏
-
484 收藏
-
405 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 485次学习