Linux 权限管理进阶:从 umask 到粘滞位的深度解析
一. 核心前置问题铺垫(面试高频)
在本篇博客起始呢,我们先来看看下面这三个问题,都是面试经常问到的,这些问题在我们的文章中后续都会得到解答。
常见问题整理:
1.进入一个目录需要什么权限?
2.什么决定了文件或者目录的默认权限?
3.root 新建的文件,普通用户不读不写不执行,可以删除吗?
–在这里我们先对第一个问题进行一个回答,这个我们在上篇博客中就有解答过,这里就直接展示了
其它两个的答案先放着,后面再详细解释:
2.什么决定了文件或者目录的默认权限? 文件或目录的默认权限由系统的 umask 值 决定。
3.root 新建的文件,普通用户不读不写不执行,可以删除吗?
可以,删除文件不是由文件决定,是由文件所在目录决定
二. umask:新文件权限的 “隐形调控者”
2.1 功能与原理
umask(文件权限掩码)的核心作用是调整新创建文件 / 目录的默认权限。Linux 系统对新文件和目录有 “初始最大权限”:
- 新文件默认最大权限为
0666(即rw-rw-rw-,可读、可写); - 新目录默认最大权限为
0777(即rwxrwxrwx,可读、可写、可执行)。 umask可以查看当前默认权限掩码,主要看后三位。
注意:实际创建的资源权限并非直接使用这个 “最大值”,而是要经过umask的一些运算(绝对不是简单的减法,后面的图片演示里有具体运算过程)。公式为:实际权限 = 最大初始权限 & ~umask(~表示按位取反,&表示按位与,注意都是八进制转成二进制后运算)。
2.2 格式与实际案例
格式:umask 权限值
说明:将现有的存取权限减去权限掩码后,即可产生建立文件时预设权限。超级用户默认掩码值为0022,普通用户默认为0002(后面的演示图里暂时用的超级用户,代码尽量会开始使用普通用户演示,但是如果大家会配置sudo权限的话,尽量全部使用普通用户比较好,不会也没事,以后会讲到的)
实际案例:
# root查看umask以及创建文件和目录的默认权限
[root@VM-0-3-centos lesson7]# umask
0022
[root@VM-0-3-centos lesson7]# ll
total 4
drwxr-xr-x 2 root root 4096 Oct 29 22:54 dir
-rw-r--r-- 1 root root 0 Oct 29 22:19 text.txt
# 普通账户查看umask以及创建文件和目录的默认权限
[Lotso@VM-0-3-centos lesson7]$ umask
0003
[Lotso@VM-0-3-centos 118]$ ll
total 4
drwxrwxr-- 2 Lotso Lotso 4096 Oct 30 11:16 dir
-rw-rw-r-- 1 Lotso Lotso 0 Oct 30 11:16 text.txt
# 临时修改umask,达到不想让所属组和other有任何权限(文件用066也行本来就没x权限,目录必须077)
[Lotso@VM-0-3-centos lesson7]$ umask 077
[Lotso@VM-0-3-centos lesson7]$ umask
0077
# 我们再创建文件或者目录就会发现默认权限变了,达到了我们的目的
[Lotso@VM-0-3-centos 118]$ ll
total 4
drwx------ 2 Lotso Lotso 4096 Oct 30 11:18 dir
-rw------- 1 Lotso Lotso 0 Oct 30 11:18 text.txt
第2个常见问题的解答以及当前知识点演示图(一定要看):

2.3 细节问题总结(附创建一批文件的操作)
细节问题:
- 不同的系统,不同的用户,umask可能不同(上面讲过)
- 不用担心umask被更改的问题,退出登录,重登就会恢复默认
- 当需要创建一批文件并想要它们的默认权限符合我们的预期时,umask就很好用了;那如何创建和删除一批文件呢(我们后续也可能会用到,这里先看看),注意下面的演示。
# 此时的umask是 0077,能让下面所有文件都达到不让所属组和other有任何权限的目的。
# 创建一批文件
[Scy@VM-0-3-centos 118]$ touch hello{1..100}.txt
[Scy@VM-0-3-centos 118]$ ll
total 4
drwx------ 2 Scy Scy 4096 Oct 30 11:18 dir
-rw------- 1 Scy Scy 0 Oct 30 11:56 hello100.txt
-rw------- 1 Scy Scy 0 Oct 30 11:56 hello10.txt
-rw------- 1 Scy Scy 0 Oct 30 11:56 hello11.txt
-rw------- 1 Scy Scy 0 Oct 30 11:56 hello12.txt
-rw------- 1 Scy Scy 0 Oct 30 11:56 hello13.txt
-rw------- 1 Scy Scy 0 Oct 30 11:56 hello14.txt
-rw------- 1 Scy Scy 0 Oct 30 11:56 hello15.txt
-rw------- 1 Scy Scy 0 Oct 30 11:56 hello16.txt
-rw------- 1 Scy Scy 0 Oct 30 11:56 hello17.txt
-rw------- 1 Scy Scy 0 Oct 30 11:56 hello18.txt
-rw------- 1 Scy Scy 0 Oct 30 11:56 hello19.txt
-rw------- 1 Scy Scy 0 Oct 30 11:56 hello1.txt
.................... #省略
# 删除一批文件
[Scy@VM-0-3-centos 118]$ rm -rf hello{1..100}.txt
[Scy@VM-0-3-centos 118]$ ll
total 4
drwx------ 2 Scy Scy 4096 Oct 30 11:18 dir
-rw------- 1 Scy Scy 0 Oct 30 11:18 text.txt
三. file 指令:文件类型的 “识别器”
3.1 功能和语法
file 指令的核心作用就是辨识文件类型,语法为:file [选项] 文件或者目录 …
3.2 常用选项和实际案例
常用选项:
-c:详细显示指令执行过程,便于排错或分析程序执行的情形。-z:尝试去解读压缩文件的内容。
实际案例:
# 辨识文件类型
[Lotso@VM-0-3-centos 118]$ file text.txt
text.txt: empty
[Lotso@VM-0-3centos 118]$ file /usr/bin/ls
/usr/bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=c8ada1f7095f6b2bb7ddc848e088c2d615c3743e, stripped
[Lotso@VM-0-3-centos 118]$ file /usr/bin/yum
/usr/bin/yum: Python script, ASCII text executable
四. 目录权限:容易踩坑的 “特殊逻辑”
4.1 目录权限的核心规则
这个也是我们最上面解决第1个问题的核心关键
目录的权限与文件权限有本质区别,需重点理解三点:
可执行权限(x):无 x 权限则无法cd进入目录;可读权限(r):无 r 权限则无法用ls等命令查看目录内文件;可写权限(w):无 w 权限则无法在目录中创建、删除文件。

关键坑点:只要用户对目录有w权限,就可以删除目录内的所有文件,无论该用户是否有文件本身的写权限。
我们直接拿上篇博客中最后的模拟示例来看看:
# 1. root设置/home目录为777(所有用户可写)
[root@bite-alicloud ~]$ chmod 777 /home
[root@bite-alicloud ~]$ ls -ld /home
drwxrwxrwx. 3 root root 4096 Oct 22 15:58 /home
# 2. root在/home创建root.c(所有者为root)
[root@bite-alicloud ~]$ touch /home/root.c
[root@bite-alicloud ~]$ ls -l /home/root.c
-rw-r--r--. 1 root root 0 Oct 22 15:59 /home/root.c
# 3. 普通用户litao删除root.c(因/home有写权限,成功删除)
[root@bite-alicloud ~]$ su - litao
[litao@localhost ~]$ rm /home/root.c
rm: remove regular empty file '/home/root.c'? y # 确认删除
[litao@localhost ~]$ ls /home/root.c # 验证删除
ls: cannot access '/home/root.c': No such file or directory
第3个问题解答以及图示解析:
4.2 补充:Linux下的共享文件话题
我们这里再补充一个Linux下共享文件的操作,直接用图片展示给大家
–大家在上图中可以发现,我们引入了粘滞位去满足我们的需求解决一些问题,那么下面这个上次遗留下来的问题也可以得到解决了。我们接着来看下个版块吧。
小问题
这里我们会发现一个很奇怪的事:我作为普通用户,既不是
root.c文件的所有者,也不是其所属组的成员,同时作为 “其他用户” 也没有对该文件的写权限,但我却能删掉这个由root创建的文件。这是因为,我对这个文件所在的目录拥有写权限。具体原因可以结合本文 1.3 部分的内容来理解。
但是,这样可以随意删除
root或其他人的文件,显然是不合理的。我们该如何解决这个问题呢?我们将在下一篇文章中揭晓答案。
五. 粘滞位:解决目录权限 “不科学” 的方案
为了修复 “用户可删除目录内他人文件” 的问题,Linux 引入了粘滞位(Sticky Bit)机制。
5.1 功能与设置
给目录添加粘滞位后,该目录下的文件仅能由三类主体删除:
- 超级管理员(root);
- 该目录的所有者(这点不那么重要,知道就行);
- 该文件的所有者。
设置粘滞位的指令为:
chmod +t 目录名
5.2 实际使用案例
简单演示(大家可以自己去试试):
[root@localhost ~]$ chmod +t /home/ # 加上粘滞位
[root@localhost ~]$ ls -ld /home/
drwxrwxrwt. 3 root root 4096 9⽉ 19 16:00 /home/
[root@localhost ~]$ su - litao
[litao@localhost ~]$ rm /home/abc.c #litao不能删除别⼈的⽂件
rm:是否删除有写保护的普通空⽂件 "/home/abc.c"?y
rm: ⽆法删除"/home/abc.c": 不允许的操作
更多推荐




所有评论(0)