
观众老爷们大家好 这里是邪修KING的独家频道 本文属于系列Linux系统篇 ------操作指令 一起学Linux的小伙伴可订阅专栏: Linux系统篇
概述&序言
上一篇我们在结尾留下了一个思考题:同样一条命令,为什么 root 用户可以畅通无阻,普通用户却常常提示「Permission denied」?Shell 命令行解释器在执行命令前,核心工作之一就是做权限校验。
权限是 Linux 多用户操作系统的安全基石,也是整个 Linux 体系中最核心的概念之一。从文件访问、软件安装到系统配置,所有操作都绕不开权限校验。本章我们从用户身份出发,逐层拆解权限的角色划分、权限位含义、修改方法,并深度剖析三个最容易混淆的核心问题:目录的 rwx 到底是什么、默认权限由什么决定、文件删除权到底归谁。
一、Linux 用户体系:超级用户与普通用户
1.1 两类用户
和 Windows 系统的「管理员账户 / 普通账户」分类类似,Linux 系统也将用户分为两大类:
| 用户类型 | 权限特点 | 代表 |
|---|---|---|
| 超级用户(root) | 权限不受任何约束,可以操作系统内的一切资源,相当于系统的上帝 | 用户名固定为 root,命令提示符为 # |
| 普通用户 | 权限受限,只能在自己的权限范围内操作,不能修改系统级配置,不能访问其他用户的私有资源 | 自建用户,命令提示符为 $ |
设计两类用户的核心目的是安全:日常使用普通用户操作,避免误操作破坏系统;只有需要管理系统时才提升到 root 权限。
1.2 su 指令:切换用户身份
su 全称 Switch User ,用于在不同用户身份之间切换。
语法与常用用法
bash
# 1. 切换到指定用户(需要输入目标用户的密码)
su 用户名
# 2. 切换到 root 用户(需要输入 root 密码)
su
# 3. 切换用户并重新加载环境变量(切换到目标用户的家目录,推荐使用)
su - 用户名
su - root
关键细节
普通用户 → root / 其他用户 :需要输入目标用户的密码,验证通过才能切换。
root → 任意普通用户 :不需要输入密码,直接切换成功。因为 root 权限最高,不需要验证。
su 和 su - 的区别:
su 用户名:只切换身份,不切换工作目录和环境变量,还停留在当前目录
su - 用户名:完全切换,包括工作目录切换到目标用户的家目录,重新加载用户环境变量,更彻底
示例:
bash
# 当前是普通用户 ubuntu
ubuntu@VM-0-16-ubuntu:~$ su - root
Password: # 输入 root 密码
root@VM-0-16-ubuntu:~# # 切换成功,提示符变成 #
# root 切回普通用户,无需密码
root@VM-0-16-ubuntu:~# su ubuntu
ubuntu@VM-0-16-ubuntu:/root$
1.3 sudo:临时精准提权
su 切换到 root 后就拥有了全部最高权限,权限过大,操作风险很高。实际开发中更常用的是 sudo:只对单条命令临时提升 root 权限 ,执行完立刻回到普通用户身份。
典型场景
安装软件就是最典型的例子:软件需要安装到系统公共目录(如 /usr/bin),普通用户没有写入权限,但软件安装后所有用户都可以使用,只需要安装那一刻有 root 权限即可。
bash
# 普通用户直接安装软件,权限不足报错
ubuntu@VM-0-16-ubuntu:~$ apt install gcc
# E: Could not open lock file ... Permission denied
# 加 sudo 临时提权,输入当前用户密码即可
ubuntu@VM-0-16-ubuntu:~$ sudo apt install gcc
# 输入当前用户密码,验证通过后以 root 权限执行安装
设计优势:
不用泄露 root 密码,普通用户输入自己的密码即可完成授权操作
权限最小化:只给单条命令提权,避免全程 root 带来的安全风险
可配置:系统管理员可以精确控制哪些用户能对哪些命令使用 sudo
注:Ubuntu 系统默认创建的第一个用户默认拥有 sudo 权限,其他用户需要 root 手动配置才能使用 sudo。
二、权限的本质与三类角色
2.1 权限是什么?为什么需要权限?
权限的本质 :规定「谁」对「某个目标」能不能做某件事。
为什么需要权限 :
1.约束用户行为,防止误操作破坏系统 :普通用户不能随便删系统文件、改内核配置,保证系统稳定。
2,实现多用户隔离 :一台服务器可以同时给多个用户使用,用户之间互不干扰、互不窥探。
我们常说「权限 = 角色 + 目标属性」:
角色:操作者的身份
目标属性:目标对象本身的权限标记
而 Linux 下「一切皆文件」,我们面对的所有操作对象本质都是文件,因此 Linux 的权限体系全部围绕文件权限展开。
2.2 三类角色:拥有者、所属组、其他
Linux 为每个文件都定义了三类角色,分别对应三套独立的权限:
| 角色 | 英文标识 | 含义 |
|---|---|---|
| 拥有者 | User(u) | 文件的创建者、所有者 |
| 所属组 | Group(g) | 文件归属的用户组,同组内的用户共享这套权限 |
| 其他用户 | Other(o) | 既不是拥有者、也不在所属组里的其他所有用户 |
2.3 为什么要有「所属组」?
如果只有「拥有者」和「其他人」两类,权限粒度太粗:要么是自己的完全控制,要么是所有人都一样的权限。
加入「所属组」后,可以实现精细化的团队协作:
一个项目组的成员都加入同一个用户组
项目文件设置为「同组可读可写、其他用户无权访问」
这样组内成员可以协作修改,组外人员无法访问,完美平衡了便利性和安全性
2.4 ls -l 权限位完整拆解
我们执行 ll(等价于 ls -l)时,第一列的 10 个字符就是文件的类型与权限位,我们逐位拆解:
目录文件示例
bash
drwxrwxr-x 3 ubuntu ubuntu 4096 Jul 26 23:34 lesson4/
| 第 1 位 | 第 2-4 位 | 第 5-7 位 | 第 8-10 位 | 链接数 | 拥有者 | 所属组 | 大小 | 时间 | 文件名 |
|---|---|---|---|---|---|---|---|---|---|
| d | rwx | rwx | r-x | 3 | ubuntu | ubuntu | 4096 | Jul 26 23:34 | lesson4/ |
| 文件类型 | 拥有者权限 | 所属组权限 | 其他用户权限 |
普通文件示例
bash
-rw-rw-r-- 1 ubuntu ubuntu 27 Jul 26 18:09 log.c
| 第 1 位 | 第 2-4 位 | 第 5-7 位 | 第 8-10 位 |
|---|---|---|---|
| - | rw- | rw- | r-- |
| 普通文件 | 拥有者:读 + 写 | 所属组:读 + 写 | 其他用户:只读 |
每一组的三个位置固定对应 r w x,有该权限显示字母,没有则显示 -:
r(read):读权限
w(write):写权限
x(execute):执行权限
三、权限的修改与管理
3.1 普通文件的 rwx 含义
先从最容易理解的普通文件说起:
| 权限 | 普通文件中的含义 |
|---|---|
| r | 可以读取文件内容,比如 cat、less 查看 |
| w | 可以修改文件内容,比如写入、追加、清空 |
| x | 可以执行该文件(二进制程序、脚本等) |
3.2 chmod:修改文件权限
chmod 全称 Change Mode ,用于修改文件的权限位。只有文件拥有者和 root 可以修改文件权限。
方式一:字符表示法(适合少量修改)
用 u/g/o/a 指定角色,用 +/-/= 表示增加、移除、设置权限,后跟 r/w/x。
| 标识 | 含义 |
|---|---|
| u | 拥有者 user |
| g | 所属组 group |
| o | 其他用户 other |
| a | 全部三类 all |
| + | 增加权限 |
| - | 移除权限 |
| = | 精确设置权限 |
示例
bash
# 给拥有者增加执行权限
chmod u+x log.c
# 给所属组移除写权限
chmod g-w log.c
# 给其他用户设置为只读
chmod o=r log.c
# 给所有用户增加执行权限
chmod a+x log.c
# 同时设置多个角色,逗号分隔
chmod u=rwx,g=rx,o=r log.c
方式二:八进制数字法(适合整体设置)
将每一组权限用三位二进制表示,r=4、w=2、x=1,求和后得到一个八进制数字,三组权限对应三个数字。
| 权限组合 | 二进制 | 八进制 |
|---|---|---|
| rwx | 111 | 7 |
| rw- | 110 | 6 |
| r-x | 101 | 5 |
| r-- | 100 | 4 |
| --- | 000 | 0 |
最常见的权限组合:
777 → rwxrwxrwx:所有人都有全部权限
755 → rwxr-xr-x:拥有者全权限,组和其他只读 + 执行(可执行程序常用)
644 → rw-r--r--:拥有者读写,其他人只读(普通文本文件常用)
600 → rw-------:只有拥有者自己能读写(私密文件、密钥文件常用)
示例
bash
# 设置为所有人全权限
chmod 777 log.c
# 设置为拥有者读写,其他只读
chmod 644 log.c
# 目录递归设置权限(-R 递归所有子文件)
chmod -R 755 lesson4/
3.3 权限匹配规则:命中即停止
系统判断用户权限时,按 拥有者 → 所属组 → 其他用户 的顺序依次匹配:
先判断用户是不是文件的拥有者,如果是,直接使用拥有者权限,不再往下判断
如果不是拥有者,判断是否在所属组里,如果是,使用所属组权限
都不是,才使用 other 权限
⚠️ 重要:只匹配一次,命中就停止。 不会出现「拥有者没权限但组里有权限,所以能用组权限」的情况。
3.4 chown /chgrp:修改拥有者与所属组
chown:修改文件的拥有者(change owner)
chgrp:修改文件的所属组(change group)
为什么普通用户不能随便把文件「送人」?
系统默认不允许普通用户将自己的文件转让给其他用户。原因很简单:
如果可以随意转让文件所有权,恶意用户就可以把塞满病毒的文件改成 root 所有,或者把系统关键文件改成自己所有,存在巨大安全隐患。
因此普通用户执行 chown 会直接报错,必须提升到 root 权限才能修改。
示例:
bash
# 普通用户修改文件拥有者,直接报错
ubuntu@VM-0-16-ubuntu:~$ chown root log.c
# chown: changing ownership of 'log.c': Operation not permitted
# 加 sudo 提权后可以修改
ubuntu@VM-0-16-ubuntu:~$ sudo chown root log.c
# 修改所属组
sudo chgrp root log.c
# 同时修改拥有者和所属组(冒号分隔)
sudo chown root:root log.c
3.5 核心认知:root 不受权限约束
root 是超级管理员,权限系统对 root 完全不生效:
任何文件,哪怕权限是 000(所有人都没权限),root 照样可以读写执行
任何目录,哪怕没有 x 权限,root 照样可以进入
任何文件,root 都可以随意修改拥有者、权限位
这也是为什么 root 权限极高、日常不推荐使用的原因:没有权限保护,误操作会直接摧毁系统。
3.6 澄清:可执行权限 ≠ 文件一定能运行
很多初学者会混淆:给文件加了 x 权限,是不是就变成可执行程序了?
不是。
x 权限只是「许可」: 允许你去尝试执行这个文件
文件本身的内容才是「能力」 :只有它本身是可执行的二进制程序、或者带解释器声明的脚本,才能真正运行
举个例子:给一个普通的 txt 文本文件加 x 权限,你有权限执行它,但它本身不是可执行程序,执行依然会报错。
一句话总结:有 x 权限不一定能执行,没 x 权限肯定不能执行。
四、三大核心权限问题深度解析
4.1 问题一:目录的 rwx 分别代表什么?
很多人会把文件的 rwx 直接套到目录上,这是错误的。目录的 rwx 含义和普通文件完全不同,也是面试高频考点。
逐个拆解
| 权限 | 在目录中的含义 |
|---|---|
| r(读) | 可以查看目录内的文件列表,也就是能执行 ls 看到里面有哪些文件 |
| w(写) | 可以在目录内新建、删除、重命名文件 / 子目录 |
| x(执行) | 可以进入该目录,也就是能执行 cd 进入,也能访问目录内文件的详情 |
三个关键结论
1.想进入一个目录,必须要有 x 权限 。这是目录最基础的权限,没有 x 连目录都进不去,其他权限都无从谈起。
2.只有 r 没有 x:能看到文件名列表,但看不到文件的详情(大小、权限等),也打不开文件。
3.只有 x 没有 r:能进入目录,但看不到里面有什么文件,必须知道确切的文件名才能访问。
实用结论:正常使用的目录,rwx 三个权限一般都要有,缺一不可。
实操验证(普通用户视角)
bash
# 1. 创建测试目录和文件
mkdir test_dir
touch test_dir/a.txt
# 2. 去掉目录的 x 权限
chmod u-x test_dir
# 尝试进入目录 → 失败
cd test_dir
# bash: cd: test_dir: Permission denied
# 尝试 ls 查看 → 能看到文件名但看不到详情
ls test_dir
# ls: cannot access 'test_dir/a.txt': Permission denied
# a.txt
# 3. 恢复 x,去掉 r 权限
chmod u+x,u-r test_dir
cd test_dir # 可以进入
ls # 看不到里面有什么文件
# ls: cannot open directory '.': Permission denied
# 4. root 不受限制:哪怕权限全关,root 照样操作
sudo chmod 000 test_dir
sudo ls test_dir # root 正常查看
sudo cd test_dir # root 正常进入
延伸:多用户是怎么互相隔离的?
每个用户的家目录(比如 /home/ubuntu)默认权限通常是 750 或 700,其他用户没有 x 权限,因此普通用户无法进入其他用户的家目录,自然也就看不到、修改不了别人的文件,实现了用户级别的隔离。
4.2 问题二:文件的默认权限从哪来?umask 权限掩码
我们每次新建文件、新建目录,系统都会自动分配一组默认权限。这个默认权限不是凭空来的,由「起始权限」和「权限掩码 umask」共同决定。
第一步:起始权限
Linux 规定了两类文件的起始基础权限:
普通文件 :起始权限为 666(rw-rw-rw-),默认不带执行权限。因为可执行是高风险权限,系统默认不自动给。
目录文件 :起始权限为 777(rwxrwxrwx),默认带 x 权限。因为目录的 x 是基础功能,没有就没法用。
第二步:umask 权限掩码
umask 叫做权限掩码 ,作用是:凡是 umask 中出现的权限位,最终权限中都要去掉。
计算公式:
bash
最终权限 = 起始权限 & (~umask)
也就是「起始权限」按位与「umask 取反」,本质就是去掉 umask 中指定的权限位。
⚠️ 注意:不是简单的减法,是位运算。虽然偶数位减法和位运算结果一致,但概念上完全不同。
实操验证
Ubuntu 系统默认 umask 一般是 0002,其中第一位是特殊权限位,我们关注后三位 002 即可:
bash
# 查看当前 umask 值
umask
# 输出:0002
我们计算一下:
umask 后三位 002 → -------w-
~umask → rwxrwxr-x
普通文件最终权限:
666(rw-rw-rw-) & ~002 = rw-rw-r-- → 也就是 664
目录最终权限:
777(rwxrwxrwx) & ~002 = rwxrwxr-x → 也就是 775
我们新建文件验证:
bash
# 新建普通文件,查看权限
touch test.txt
ll test.txt
# -rw-rw-r-- 1 ubuntu ubuntu 0 Jul 28 10:08 test.txt → 正好是 664
# 新建目录,查看权限
mkdir test_dir
ll -d test_dir
# drwxrwxr-x 2 ubuntu ubuntu 4096 Jul 28 10:08 test_dir → 正好是 775
为什么需要 umask?
系统的起始权限是固定的,但不同场景对安全等级的要求不同:
个人开发环境:权限松一点,umask 设 002,同组用户可以协作
高安全服务器:权限严一点,umask 设 077,新建文件只有自己能读写,组和其他用户全无权限
umask 是可配置的,让系统可以灵活控制默认权限,保证所有新建文件的权限都符合安全规范,不用每个文件创建后再手动修改。
4.3 问题三:文件能不能被删除,谁说了算?
这是最反常识的一个知识点,也是面试高频题。
结论先抛出来
一个文件能否被删除,和文件本身的权限无关,只和它所在目录的 w 权限有关!
为什么?
删除文件,本质上不是修改文件本身,而是修改目录中的目录项 ------ 把这个文件名从目录的列表里去掉。既然是修改目录的内容,那自然需要目录的 w 权限。
举个极端例子:
你在公共目录里放了一个文件,权限设为 444(所有人只读,谁都不能改)
但别人对这个公共目录有 w 权限,那他照样可以直接删掉这个文件
反过来:如果目录没有 w 权限,哪怕文件是你自己的、权限全开,你也删不了它
共享目录的安全痛点
多人协作的共享目录,大家都需要 w 权限来新建文件。但有了 w 权限,就意味着任何人都能删掉别人的文件,这显然不合理。
Linux 为此专门设计了一个特殊权限位:粘滞位(Sticky Bit)。
粘滞位:保护共享目录的文件
作用对象:只能给目录设置,给普通文件设置没有意义
效果:设置了粘滞位的目录,里面的文件只有文件拥有者、目录拥有者和 root 才能删除 ;其他用户哪怕有目录的 w 权限,也只能删自己的文件,删不了别人的。
设置方法:chmod +t 目录名
标识:设置后,other 位的 x 会变成 t,比如 drwxrwxrwt
实操示例
bash
# 1. root 创建公共共享目录,权限 777
sudo mkdir /public_shared
sudo chmod 777 /public_shared
# 2. 用户 A 在里面创建文件
# userA@server:~$ touch /public_shared/a_file
# 3. 用户 B 可以随便删掉 A 的文件(没设粘滞位时)
# userB@server:~$ rm /public_shared/a_file # 成功删除
# 4. 设置粘滞位
sudo chmod +t /public_shared
ll -d /public_shared
# drwxrwxrwt 2 root root 4096 Jul 28 10:20 /public_shared
# 5. 再试:用户 B 无法删除用户 A 的文件
# userB@server:~$ rm /public_shared/a_file
# rm: cannot remove 'a_file': Operation not permitted
最佳实践:多人共享的公共目录,一定要设置粘滞位。系统自带的 /tmp 目录就是典型的粘滞位目录,所有人都能在里面建文件,但只能删自己的。
五、本章总结 & 下篇预告
本章核心要点回顾
用户身份:Linux 分 root 超级用户和普通用户;su 切换身份,sudo 临时单条命令提权,更安全。
三类角色:每个文件都有拥有者、所属组、其他用户三套独立权限,实现精细化权限控制。
权限修改:chmod 支持字符法和八进制数字法;chown/chgrp 修改归属,普通用户无权操作,需要 root 权限。
目录权限:r 看列表、w 增删文件、x 进入目录;进入目录必须有 x 权限。
默认权限:由起始权限(文件 666、目录 777)按位与 umask 取反得到,umask 控制默认安全等级。
文件删除:由所在目录的 w 权限决定,和文件本身权限无关;共享目录设置粘滞位防止误删他人文件。
root 特性:root 用户不受任何权限约束,拥有系统最高权力。
