如果你曾在终端里敲命令时被一句Permission denied怼回来过这篇文章就是为你准备的。我们将从「为什么要有权限」开始把用户切换、rwx、chmod 八进制、umask 掩码、粘滞位这些看似零散的知识点串成一条完整的逻辑链。前置知识为什么会有「权限」这种东西一个很现实的场景Linux 是多用户操作系统。一台服务器上可能同时有 root 管理员、后端开发、前端开发、运维实习生同时登录。如果实习生不小心rm -rf /那就出大事了。权限的本质决定谁用户/角色能对什么资源文件/目录做什么操作读/写/执行。权限 人用户 角色 文件属性rwx人你的账号身份是什么root 还是普通用户你在目标文件面前扮演什么角色文件属性目标文件身上挂了哪些权限标签可读可写可执行两种用户级别用户类型特点root超级用户不受权限限制可以做任何事。例如 root 切换到任何普通用户都不需要密码普通用户受权限约束只能访问自己被授权的内容 root 的特权体现之一su切换到任何用户无需输入目标用户的密码而普通用户su切换时必须输入目标密码。第一部分su 和 sudo —— 切换身份的两种姿势suswitch usersu # 不跟用户名默认切换到 root因为系统 100% 存在 root su alice # 切换到 alice 用户 su - # 以重新登录的方式切换自动跳转到目标用户的家目录 su - alice # 组合用法密码规则切换方向需要谁的密码普通用户 → root输入root密码root → 普通用户不需要密码特权普通用户 A → 普通用户 B输入B的密码sudosuper user dosu的问题是什么你告诉了别人 root 密码他就能为所欲为。sudo解决了这个问题。sudo vim /etc/nginx/nginx.conf # 临时提权执行单条命令sudo 的逻辑你输入自己的密码不是 root 密码系统查/etc/sudoers这个白名单文件看你是不是被允许执行这条命令白名单的编辑权限只在 root 手里普通用户改不了❓为什么 sudo 不设计成输入 root 密码如果输入的是 root 密码那 sudo 就退化成了 su —— 知道 root 密码的人还是可以为所欲为。sudo 的设计哲学是短暂地放宽一个受信任用户的权限而不是交出 root 的钥匙。白名单机制让 root 可以在不泄露自己密码的前提下精准控制谁可以做什么。su vs sudo 对比susudo需要谁的密码目标用户的密码自己的密码权限范围完全切换身份单条命令临时提权安全程度知道 root 密码 拥有 root白名单精准控制root 密码不外泄适用场景管理员日常维护给普通用户开放特定高权限操作第二部分文件权限的构成 —— 三个角色 × 三种操作用ls -l看一个文件的属性-rw-r--r-- 1 alice dev 50 Jul 19 17:23 test.txt拆解第一列的-rw-r--r--- rw- r-- r-- │ │ │ │ │ │ │ └── other 权限其它用户 │ │ └───────── group 权限所属组 │ └──────────────── user 权限拥有者 └────────────────────── 文件类型- 普通文件d 目录l 链接三个角色角色缩写说明举例拥有者uuser文件的主人一般是创建者alice 创建的test.txt拥有者是 alice所属组ggroup一个用户组组内成员共享权限dev 组的所有成员对test.txt拥有 g 权限其它者oother既不是拥有者、也不属于所属组的所有人路人甲❓为什么要有所属组当你想对特定的一群人开放权限而不是对所有人开放时组就是最合适的管理单元。比如后端开发组能读写项目代码但前端组只能读。三种权限权限字母对文件对目录可读r能查看文件内容cat、more能列出目录内的文件名ls可写w能修改文件内容能在目录内新增、删除、重命名文件可执行x能运行该文件可执行程序/脚本能进入该目录cd能访问目录内文件关键认知同一个 r/w/x对文件和目录的含义完全不同。比如目录的 w 权限决定的是你能不能在里面新建/删除文件而不是修改目录本身的内容。第三部分chmod —— 修改文件权限⚠️ 只有文件的拥有者和root才能修改文件的权限。方式一符号法直观适合新手chmod 角色 操作 权限 文件名 │ │ │ u r g - w o x aall全部示例chmod uw test.txt # 给拥有者添加写权限 chmod g-r test.txt # 去掉所属组的读权限 chmod ox script.sh # 给其它用户添加执行权限 chmod ar shared.txt # 给所有人添加读权限等于不写角色默认 a chmod u-rw,gr test.txt # 同时修改多个角色用逗号隔开逗号后不要加空格 chmod urwx,grx,o test.txt # 表示精确设置为指定权限o 表示 other 没有任何权限方式二八进制数字法更常用高手必备每个权限对应一个数字r读 4 w写 2 x执行 1 -无 0 例如 rwx 421 7 rw- 420 6 r-x 401 5 r-- 400 4 -w- 020 2 --x 001 1 --- 000 0三个角色各用一个 0~7 的数字表示组成三位数chmod 755 script.sh # rwx r-x r-x → 拥有者全权限其他人只读执行 chmod 644 data.txt # rw- r-- r-- → 拥有者可读写其他人只读 chmod 600 secret.txt # rw- --- --- → 只有拥有者能读写私密文件 chmod 777 public.txt # rwx rwx rwx → 所有人全权限不安全常见数字组合速查数字含义典型用途755rwx r-x r-x可执行脚本、目录644rw- r-- r--普通文本文件600rw- --- ---私钥、密码文件700rwx --- ---个人脚本777rwx rwx rwx临时共享⚠️ 不推荐长期使用⚡ 权限匹配的一次验证原则这是一个很容易踩坑的机制用户访问文件时系统按照u → g → o的顺序匹配身份只匹配一次。一旦身份确定就只看该身份的权限不会因为 g 权限更大而降级使用。示例alice 是test.txt的拥有者同时也是其所属组dev的成员。-r---w-rw- 1 alice dev test.txtalice 对此文件的权限是r--只有读不是rw-。为什么因为系统先匹配到她是拥有者u就锁定用 u 的权限r--不会再去检查她作为组成员的 g 权限。 一句话权限验证是一次匹配立即生效不是取所有身份的最大权限。第四部分chown 和 chgrp —— 修改文件的拥有者和所属组⚠️ 修改拥有者和所属组是root 专属权限。即使你是文件的拥有者也不能把文件送给别人只能用sudo。# chown修改拥有者change owner chown root test.txt # 把拥有者改为 root chown alice:dev test.txt # 同时修改拥有者和所属组 chown :dev test.txt # 只修改所属组冒号前留空 # chgrp修改所属组change group chgrp dev test.txt # 把所属组改为 dev实际演示[rootserver ~]# ll -r-------- 1 whb whb 50 Jul 19 17:23 test.txt # 拥有者 whb所属组 whb [rootserver ~]# chown root test.txt -r-------- 1 root whb 50 Jul 19 17:23 test.txt # 拥有者 → root [rootserver ~]# chgrp root test.txt -r-------- 1 root root 50 Jul 19 17:23 test.txt # 所属组 → root [rootserver ~]# chown whb:whb test.txt -r-------- 1 whb whb 50 Jul 19 17:23 test.txt # 一键改回第五部分Linux 文件类型速览ls -l输出的第一个字符代表的不是权限而是文件类型首字符类型说明举例-普通文件源代码、文本、可执行程序、图片、库hello.c、a.outd目录目录本质上也是文件存储的是其内部文件的元数据列表my_project/l符号链接相当于 Windows 的快捷方式/lib64 → usr/lib64c字符设备按顺序 IO以字符为单位不支持随机读写键盘、显示器b块设备支持随机读写以数据块为单位硬盘、U 盘p管道文件进程间通信s套接字网络/本地进程间通信第六部分目录的 rwx —— 一个容易搞错的地方目录本身只是一个登记表存储的是内部文件的属性文件名、inode 号等而不是文件的内容。理解了这一点下面的规则就顺了。进入一个目录需要什么权限权限能否进入目录cd能否 ls 查看文件名能否在目录内新建/删除/重命名能否访问目录内的文件只有 r❌ 进不去✅ 能 ls但看不到详细信息❌❌进都进不去只有 w❌ 进不去❌❌进不去谈何操作❌只有 x✅ 能进❌ 无法 ls❌✅知道文件名就能读内容r x✅ 能进✅ 能 ls❌✅w x✅ 能进❌✅✅知道文件名就行r w x✅ 能进✅✅✅记忆技巧x是进门卡 —— 没有 x目录的门你都进不去r是花名册 —— 允许你查阅目录里有哪些文件lsw是增删改签 —— 允许你在花名册上添加、划掉、改名不影响文件内容本身一个反直觉的细节如果目录的 w 权限被关闭但文件的 w 权限保持打开chmod 555 mydir/ # 目录r-x r-x r-x没有 w # 此时无法在 mydir/ 下新建、删除、重命名文件 # 但如果 mydir/ 下已有文件 hello.txtrw-rw-rw-... vim mydir/hello.txt # ✅ 可以修改文件内容目录的权限管不到文件内容 —— 它只管登记表上的增删改。所以删除文件 ≠ 修改文件内容。删除是修改目录的登记表目录的内容修改是改文件的正文文件的内容。两者互不干涉。第七部分umask —— 为什么新建文件的默认权限是那样新建一个文件/目录时默认权限是怎么来的起始权限文件类型起始权限原因普通文件666rw-rw-rw-默认不需要执行权限大部分文件是文本/数据目录777rwx rwx rwx进入目录需要 x所以默认给予权限掩码 umask但实际新建的文件并不会是 666/777。看看你自己系统$ umask 0002umask权限掩码的作用凡是在掩码中出现的权限都要在起始权限中去掉。最终权限 起始权限 (~umask) # 位运算取反后按位与⚠️ 这个去掉不是数学减法而是位运算。不要用777 - 022 755来理解虽然结果碰巧相同但原理完全不同。实际计算假设umask 022最常见的值普通文件 起始 666 rw- rw- rw- umask 022 --- -w- -w- 掩码要去掉组写和其他写 ~umask 755 rwx r-x r-x 666 755 644 rw- r-- r-- 目录 起始 777 rwx rwx rwx 777 755 755 rwx r-x r-x结论新建普通文件 →rw- r-- r--644拥有者可读写其他人只读 ✅新建目录 →rwx r-x r-x755拥有者全权限其他人可读可进入 ✅umask 越大默认权限越小。例如umask 077会让新建文件只有拥有者能访问。修改 umaskumask # 查看当前掩码值 umask 027 # 临时设置重启后失效第八部分粘滞位Sticky Bit—— 共享目录中的隔离墙问题场景假设有一个多人共享目录/shared权限为rwx rwx rwx777whb 创建了whb_report.txt属于 whb另一个用户 maisui 进入/shared可以删除whb_report.txt为什么因为目录的 w 权限给了 other允许在目录内删除文件。矛盾点我需要 other 有 w 权限 → 这样才能在共享目录里创建文件 但我又不想 other 删我的文件 → w 权限允许删任何人的文件怎么办粘滞位登场chmod ot /shared # 给目录的 other 加上粘滞位 # 或 chmod t /shared # 简写默认加到 other 上加上粘滞位后目录的 other 权限位从x变为tdrwxrwxrwt 2 root root 4096 Aug 3 18:00 shared/ # ↑ 注意这个 t说明粘滞位已生效粘滞位的规则在设置了粘滞位的目录下 —谁能删除文件条件root超级用户✅ 永远可以目录拥有者✅文件拥有者✅其他用户❌ 即使有 w 权限也不能删别人的文件 满足既能让大家共享又保护每个人创建的文件不被别人删除。典型应用Linux 的/tmp目录默认就设置了粘滞位$ ls -ld /tmp drwxrwxrwt 20 root root 4096 Aug 3 18:00 /tmp/ # ↑ 看到 t 了吧第九部分通配符*—— 批量操作的利器跟权限搭配的常用姿势ls *.c # 列出所有 .c 结尾的文件 ls te* # 列出所有 te 开头的文件 chmod 644 *.txt # 批量修改所有 .txt 文件的权限 rm *.tmp # 删除所有 .tmp 文件*代表任意字符任意长度。*.c 所有以.c结尾的文件te* 所有以te开头的文件。总结一张图看清全部权限位完整解读- rw- r-- r-- │ │ │ │ │ │ │ └── othero4 r-- │ │ └──────── groupg4 r-- │ └────────────── useru6 rw- └─────────────────── 文件类型- 普通文件 数字表示644命令速查表命令作用示例su切换用户su - alicesudo单条命令提权sudo vim /etc/hostschmod 符号法修改权限加减chmod uw test.txtchmod 数字法修改权限数字chmod 755 script.shchown修改拥有者chown alice:dev test.txtchgrp修改所属组chgrp dev test.txtumask查看/设置权限掩码umask 027chmod t设置粘滞位chmod t /shared关键认知集锦权限只验证一次u → g → o 顺序匹配匹配到就停不取最大值目录的 rwx ≠ 文件的 rwx目录的 w 管增删改名文件的 w 管内容修改删除文件与文件权限无关与目录权限有关你能否删一个文件取决于你对目录有没有 w 权限最终权限 ≠ 起始权限 - umask是位运算起始权限 (~umask)粘滞位只对 other 生效chmod t和chmod ot是等价的chown/chgrp 只有 root 能做文件的拥有者也不能把文件送人最好的学习方式开一个终端用touch a.txt建个文件然后把本文中的每条chmod、chown、umask命令都敲一遍每次改完用ls -l看变化。权限这东西敲 10 分钟就全记住了。本文力求为初学者提供准确、全面、易理解的 Linux 权限知识体系。如有疏漏欢迎指正。