目录
- 前言
- [一、深入理解 Linux 文件系统:文件删除与共享机制](#一、深入理解 Linux 文件系统:文件删除与共享机制)
-
- [1.1 关于文件删除的话题](#1.1 关于文件删除的话题)
-
- [1.1.1 核心原则:删除权限由目录决定](#1.1.1 核心原则:删除权限由目录决定)
- [1.1.2 实验演示:为什么 whb 能删除 root 的文件?](#1.1.2 实验演示:为什么 whb 能删除 root 的文件?)
-
- [1.1.2.1 环境准备](#1.1.2.1 环境准备)
- [1.1.2.2 制造"冲突"文件](#1.1.2.2 制造“冲突”文件)
- [1.1.2.3 见证奇迹的时刻](#1.1.2.3 见证奇迹的时刻)
- [1.1.2.4 反向思考:如果目录没有 w 权限呢?](#1.1.2.4 反向思考:如果目录没有 w 权限呢?)
- [1.2 Linux 文件共享的挑战与解决方案](#1.2 Linux 文件共享的挑战与解决方案)
-
- [1.2.1 共享目录的选址原则](#1.2.1 共享目录的选址原则)
- [1.2.2 初步实现共享](#1.2.2 初步实现共享)
- [1.2.3 共享中的安全隐患:误删风险](#1.2.3 共享中的安全隐患:误删风险)
- [1.3 粘滞位(Sticky Bit):共享目录的守护神](#1.3 粘滞位(Sticky Bit):共享目录的守护神)
-
- [1.3.1 什么是粘滞位?](#1.3.1 什么是粘滞位?)
- [1.3.2 设置粘滞位](#1.3.2 设置粘滞位)
- [1.3.3 效果验证](#1.3.3 效果验证)
- [1.3.4 现实中的应用:/tmp 目录](#1.3.4 现实中的应用:/tmp 目录)
- 结语


🎬 云泽Q :个人主页
🔥 专栏传送入口 : 《C语言》《数据结构》《C++》《Linux》《蓝桥杯系列》《笔试算法》《AI赋能》《STM32》
⛺️遇见安然遇见你,不负代码不负卿~
前言
大家好啊,我是云泽Q,欢迎阅读我的文章,一名热爱计算机技术的在校大学生,喜欢在课余时间做一些计算机技术的总结性文章,希望我的文章能为你解答困惑~
一、深入理解 Linux 文件系统:文件删除与共享机制
要真正理解 Linux 的权限管理,我们需要先搞清楚两个核心问题:关于文件删除的本质 以及关于 Linux 文件共享的实现。虽然现在的云盘和共享经济非常发达,但在 Linux 系统内部,理解文件共享的场景依然是掌握高级权限(如粘滞位)的最佳切入点。
1.1 关于文件删除的话题
1.1.1 核心原则:删除权限由目录决定
很多初学者有一个误区,认为只要我没有文件的写权限,我就删不掉这个文件。这是错误的!
在 Linux 中,删除文件的操作不由目标文件自身的读写执行权限决定,而是由该文件所在目录的写(w)权限决定。
我们可以用一个形象的比喻来理解:
"外人把衣服扔进你家洗衣机,你有权将其扔出门外。"
即使一个文件对普通用户没有任何权限(rwx 均无),只要该用户对其所在的目录拥有写权限,就能删除该文件。
1.1.2 实验演示:为什么 whb 能删除 root 的文件?
让我们通过一组具体的实验来验证这个结论。假设我们有两个用户:普通用户 whb 和超级管理员 root。
1.1.2.1 环境准备
首先,我们在用户 whb 的家目录下创建一个测试目录 118。
bash
[whb@bite-alicloud ~]$ mkdir 118
[whb@bite-alicloud ~]$ cd 118
[whb@bite-alicloud 118]$ pwd
/home/whb/code/118
此时,目录 118 的所有者是 whb,所属组也是 whb,且默认拥有所有权限(drwxrwxr-x)。
1.1.2.2 制造"冲突"文件
接着,我们切换到 root 用户,在这个属于 whb 的目录下创建几个文件,并故意剥夺其他人的权限。
bash
[root@bite-alicloud 118]# touch root1.txt root2.txt root3.txt
[root@bite-alicloud 118]# chmod o-r root{1..3}.txt
[root@bite-alicloud 118]# ll
total 0
-rw-r----- 1 root root 0 Oct 29 19:39 root1.txt
-rw-r----- 1 root root 0 Oct 29 19:39 root2.txt
-rw-r----- 1 root root 0 Oct 29 19:39 root3.txt
可以看到,这些文件属于 root,且其他用户(others)连读权限都没有。
1.1.2.3 见证奇迹的时刻
现在切回普通用户 whb,尝试删除这些文件。
bash
[whb@bite-alicloud 118]$ rm root1.txt
rm: remove write-protected regular empty file 'root1.txt'? y
[whb@bite-alicloud 118]$ ll
total 0
-rw-r----- 1 root root 0 Oct 29 19:39 root2.txt
-rw-r----- 1 root root 0 Oct 29 19:39 root3.txt
结果分析:
whb 成功删除了 root1.txt!尽管 whb 对这个文件本身没有任何权限,但因为 118 这个目录是 whb 的,他对目录有写权限(w),所以系统允许他修改目录的内容------也就是把文件名从目录列表中抹去。
1.1.2.4 反向思考:如果目录没有 w 权限呢?
如果我们将目录的权限收回,情况就会反转。
bash
[root@bite-alicloud 118]# mkdir dir
[root@bite-alicloud 118]# chmod o-w dir # 移除其他人的写权限
[root@bite-alicloud 118]# su ran # 切换到一个普通用户 ran
[ran@bite-alicloud 118]$ touch ran.txt
touch: cannot touch 'ran.txt': Permission denied
[ran@bite-alicloud 118]$ mkdir new_dir
mkdir: cannot create directory 'new_dir': Permission denied
当目录失去了 w 权限,普通用户既不能在里面新建文件,也不能删除里面的文件,无论文件本身的权限如何。
1.2 Linux 文件共享的挑战与解决方案
理解了删除机制后,我们来看看如何实现多用户之间的文件共享。这在实际开发协作中非常重要。
1.2.1 共享目录的选址原则
绝对不能在任意一个用户的家目录下进行共享!
Linux 的用户家目录(如 /home/whb)默认权限通常是 drwx------(700),这意味着除了所有者和 root,其他人连进入(x)的权限都没有。
bash
[zpw@bite-alicloud ~]$ cd /home/whb
bash: cd: /home/whb: Permission denied
因此,共享文件一般都在非用户家目录内部,通常由 root 用户在根目录或特定分区下创建公共目录。
1.2.2 初步实现共享
我们可以由 root 在根目录下创建一个公共目录 /shared_dir,并开放权限。
bash
[root@bite-alicloud /]# mkdir shared_dir
[root@bite-alicloud /]# chmod o+w shared_dir/
[root@bite-alicloud /]# ll -d shared_dir/
drwxr-xrwx 2 root root 4096 Oct 29 20:07 shared_dir/
这样,用户 whb 和 zpw 都可以进入该目录并创建文件。
bash
[whb@bite-alicloud shared_dir]$ touch shared.txt
[whb@bite-alicloud shared_dir]$ echo "aaaa" > shared.txt
此时,zpw 也可以读取这个文件:
bash
[zpw@bite-alicloud shared_dir]$ cat shared.txt
aaaa
1.2.3 共享中的安全隐患:误删风险
虽然大家都能读写,但这里存在一个巨大的隐患。回顾我们刚才讲的删除原则 :只要对目录有 w 权限,就能删除目录下的文件。
在上面的例子中,用户 xjh 虽然不是文件的创建者,但他对 /shared_dir 有写权限,所以他可以轻易删除 whb 创建的文件:
bash
[xjh@bite-alicloud shared_dir]$ rm shared.txt
rm: remove write-protected regular file 'shared.txt'? y
[xjh@bite-alicloud shared_dir]$ ll
total 0
问题来了: 我们希望所有人都能在共享目录下新建文件,但又希望每个人只能删除自己创建的文件,该怎么办?
- 方案 A:去掉目录的 w 权限? 不行!那样大家都没法新建文件了,共享功能直接瘫痪。
- 方案 B:使用特殊的权限位。 这就是我们要引入的主角------粘滞位(Sticky Bit)。
1.3 粘滞位(Sticky Bit):共享目录的守护神
1.3.1 什么是粘滞位?
粘滞位是一种特殊的权限位,专门用于目录。当一个目录被设置了粘滞位后,该目录下的文件删除规则会发生改变:
只有以下三种身份的人才能删除目录下的文件:
- 超级管理员(root)
- 该目录的所有者(通常是 root)
- 该文件的所有者(即谁创建的谁负责)
1.3.2 设置粘滞位
我们使用 chmod +t 命令来给目录设置粘滞位。
bash
[whb@bite-alicloud /]$ sudo chmod +t shared_dir/
[whb@bite-alicloud /]$ ll -d shared_dir/
drwxr-xrwt 2 root root 4096 Oct 29 20:17 shared_dir/
注意看权限位的最后一位变成了 t (如果是大写 T 则表示没有执行权限 x,小写 t 表示有执行权限 x)。
1.3.3 效果验证
设置粘滞位后,我们再次尝试用 xjh 用户去删除 whb 创建的文件。
bash
[xjh@bite-alicloud shared_dir]$ ll
total 4
-rw-rw-r-- 1 whb whb 5 Oct 29 20:14 whb.txt
[xjh@bite-alicloud shared_dir]$ rm whb.txt
rm: remove write-protected regular file 'whb.txt'? y
rm: cannot remove 'whb.txt': Operation not permitted
报错提示:Operation not permitted(操作不被允许)。
即便 xjh 对目录有写权限,但因为他不是 whb.txt 的所有者,也不是 root,系统拒绝了这次删除操作。
1.3.4 现实中的应用:/tmp 目录
其实,Linux 系统中早就为我们准备好了这样一个带有粘滞位的目录,那就是 /tmp(临时目录,该目录就在根目录下,云服务器安装后自带)。
bash
[root@bite-alicloud /]# ll -d /tmp
drwxrwxrwt. 13 root root 4096 Jul 11 2019 /tmp
你会发现 /tmp 的权限末尾也是一个 t。
- 设计初衷: 任何程序、任何用户都可以在
/tmp下创建临时文件。 - 安全保障: 防止恶意用户或错误脚本删除其他用户正在使用的临时文件。
结语
