Linux权限模型按“用户→组→其他”顺序逐层判断、一票否决,仅匹配第一个身份对应的权限位;目录操作需多权限组合生效,如cd需x、ls -l需r+x;ACL优先于UGO但同样遵循匹配即终止原则。

Linux权限模型不是“多条规则并列生效”,而是按明确顺序逐层判断、一票否决。访问能否成功,取决于**最先匹配且不拒绝的那一条规则**,而不是所有规则叠加或取最大值。
权限检查严格遵循“用户→组→其他”的优先级顺序
系统在判定一个用户对某文件/目录是否有某项操作权限时,只看三类主体中**第一个匹配的身份**,后续不再检查:
- 如果该用户是文件所有者(user),就只看u权限位,g和o权限完全不参与判断
- 如果该用户不是所有者,但属于文件所属组(group),就只看g权限位,o权限被跳过
- 只有当用户既不是所有者,也不在所属组中时,才落到other权限位上
例如:-rw-r----- 1 alice devs 1024 file.txt,用户bob属于devs组,那么他能读(r)但不能写(w)——尽管o位是-,这无关紧要;而用户carol既非alice也非devs成员,则只能看最后三位---,无任何权限。
目录操作权限必须“组合生效”,缺一不可
对目录的常见操作(如cd、ls -l、rm)往往依赖多个权限协同,单独满足某一项并不够:
- 进入目录(cd):必须有x权限(目录本身)——r和w都不行
-
列出文件名(ls):需r权限;但若想看到详细信息(
ls -l),还需x权限(否则报“Permission denied”) - 删除或重命名文件:需父目录的w+x权限(文件自身权限无关);仅文件有w权限不能删它
- 创建新文件:同样依赖父目录的w+x,与目标文件名是否已存在无关
特殊权限位(SUID/SGID/Sticky)不改变主体优先级,但修改执行行为
SUID、SGID、Sticky Bit 是附加在x位上的标志,它们不参与“谁有权限”的判定流程,而是在权限已允许执行的前提下,改变进程运行时的身份或限制删除行为:
- SUID(如 /usr/bin/passwd):普通用户执行时,进程以文件所有者(root)身份运行,但前提是该用户已通过u/g/o权限检查获得x权限
- SGID(目录上):在该目录下新建文件时自动继承目录所属组,但前提是用户已有该目录的w+x权限
- Sticky Bit(如 /tmp):允许用户在共享目录中创建文件,但只能删除自己创建的——前提是用户本就有该目录的w+x权限
ACL权限高于传统UGO,但依然服从“匹配即终止”原则
当启用了ACL(Access Control List)时,系统会在传统UGO检查前,先查找是否有针对当前用户的显式ACL条目:
- 如果有匹配的user ACL(如
user:bob:r--),则直接按此决定,跳过UGO流程 - 如果没有匹配user ACL,再查group ACL;若也没有,才回落到标准UGO三段判断
- ACL中的mask项会限制所有非所有者ACL条目的实际生效上限(例如mask为r-x,则任何ACL设置的w都会被忽略)
这种设计让ACL成为“精准插单”,而非与UGO并列叠加——它提升了灵活性,但没打破原有的优先级逻辑。


















