一.解析缺省权限与umask掩码
在Linux系统操作中,我们经常发现新建的文件或目录自带一套初始权限,这套权限并非随机分配,而是系统通过特定的逻辑计算得出的
1.1回顾权限码
在Linux中,权限通常以八进制数字或二进制位表示,每组权限由三个位(r,w,x)组成:
r(read):读权限,二进制100,十进制4
w(write):写权限,二进制010,十进制2
x(execute):执行权限,二进制001,十进制1
对于任何文件或目录,权限被分为三组:拥有者(owner),所属组(Group)以及其他用户(others)
1.2权限掩码与umask
umask即用户文件创建模式掩码,它的存在是为了从起始权限中过滤掉不希望默认开启的权限位
查看掩码:在终端输入umask
作用逻辑:umask中被设为1的位,代表在创建文件时该权限会被屏蔽
1.2.1怎么查看机器的权限掩码
cpp
[root@VM-0-9-opencloudos ~]# umask
0022
1.2.2如何修改机器的权限掩码
1.2.2.1临时生效的办法
cpp
[root@VM-0-9-opencloudos ~]# umask 0002
[root@VM-0-9-opencloudos ~]# umask
0002
[root@VM-0-9-opencloudos ~]#
如果不小心改错了,或者出现了其他问题,只需要退出重进一下就好了,这种修改方式只是临时生效
1.2.2.2永久生效的办法(慎用)
方法A;仅针对当前用户
修改个人配置文件,仅影响当前用户的开发环境
1.打开配置文件:使用命令vim~/.bashrc
2.在末尾添加:umask 0022
3.使配置生效:执行 source ~/.bashrc
方法B:针对系统的所有用户(需要root权限)
修改全局配置文件/etc/profile或/etc/bashrc,系统通常会根据用户的UID动态设置掩码
UID>199的普通用户,默认权限掩码为0002
root用户(UID为0),默认权限掩码为0022
如果贸然修改权限掩码就会:
cpp
[zbc@VM-0-9-opencloudos ~]$ touch test01
[zbc@VM-0-9-opencloudos ~]$ ls -l test01
-rw-r--r-- 1 zbc zbc 0 Apr 27 23:03 test01
[zbc@VM-0-9-opencloudos ~]$ umask 0777
[zbc@VM-0-9-opencloudos ~]$ touch test02
[zbc@VM-0-9-opencloudos ~]$ ls -l test02
---------- 1 zbc zbc 0 Apr 27 23:03 test02
[zbc@VM-0-9-opencloudos ~]$
1.2.3为什么要有权限掩码
umask目的是什么?希望凡是在umask中出现的权限,都不应该在最终权限中出现
为什么要有umask
-->a.默认权限,有OS自主决定,无法在创建前进行修改--系统可配置,可以灵活满足需要
-->b.特殊情况下,配置umask,可以控制文件的默认权限,让我们的代码可控
1.3文件与目录的初始权限与计算方式
1.3.1系统的初始权限
在不考虑掩码的情况下,系统对新建文件和目录有补贴的预设起始值
普通文件:起始权限为666(rw-rw-rw-)出于安全考虑,Linux默认不允许鑫创建的普通用户具有执行权限(x)
目录文件:起始权限为777(rwxrwxrwx),目录必须具备执行权限,用户才能进入该目录
1.3.2最终权限的计算公式
最终权限并不是简单的减法运算,而是在二进制层面的位运算,起公式如下:
最终权限=起始权限 & (∼umask)
公式解析:
1.~umask(按位取反):将掩码位翻转,把1变为0,把0变为1
2.&(按位与):将起始权限与取反后的掩码进行逻辑运算,只有起始权限为1且掩码允许保留(即取反后为1)的位,最终才会保持1
1.3.3案例实测(以umask002为例)
假设当前umask为002,二进制000 000 010
创建目录(起始权限777)
起始权限: 111 111 111(777)
umask取反:111 111 101
cpp
111 111 111 (777)
& 111 111 101 (~002)
-------------
111 111 101 => 775
创建普通文件(起始权限666)
起始权限:110 110 110(666)
umask取反:111 111 101
cpp
110 110 110 (666)
& 111 111 101 (~002)
-------------
110 110 100 => 664
二.粘滞位
在多用户协作的Linux环境中,权限管理往往面临一个矛盾:既要允许用户在公共区域共同作业,又要防止用户劳动成果被恶意破坏,粘滞位就是为了解决这一冲突而诞生的特殊权限位
2.1文件共享需求与协作背景
2.1.1协作环境的局限性
在Linux系统中,如果两个用户需要进行文件级别的协作,通常面临以下限制
私有目录无法协作:用户不能将协作文件放置任何一个人的私人账户下(/home/xxx)下,以为其他协作成果往往没有进入改目录的权限
权限管理的特性:一个核心现象是---文件能否被删除与文件本身的权限无关,而是由文件所属目录的w权限拥有者决定的
这就意味着,如果我们在一个权限开放的公共目录下协作,只要用户对该用户有w权限,他就可以删除目录下的任何文件,即使文件的拥有者不是他,但是此时w又不能去掉,去掉之后共享就不存在了
2.1.2共享目录的需求
为了实现协作,我们必须在公共目录下(如根目录/下)创建专门的共享文件夹,但随之而来的安全隐患是,如何保证在共享目录下,用户只能管理自己的文件,而不能删除别人的文件
2.2粘滞位的诞生与作用
为了解决上述保护与共享的矛盾,Linux引入了粘滞位
2.2.1核心特征与定义
权限标志位:在目录权限的最后一位(others的执行位)显示为t(如果原本与x权限)或T(如果原本没有x权限)
核心功能:当一个目录被设置了粘滞位后,该目录只能由以下三类人删除:
1.超级管理员root
2.该目录的拥有者
3.该文件的拥有者
2.2.2典型案例:系统的/tmp目录
Linux系统自带的/tmp目录就是一个完美的粘滞位应用案例,任何人都可以在/tmp下创建临时文件,但是由于粘滞位的存在,普通用户无法删除属于他人的临时文件,tmp原本的作用就是存放系统产生的各种临时文件
cpp
[root@VM-0-9-opencloudos ~]# cd ..
[root@VM-0-9-opencloudos /]# ls -al
total 20
dr-xr-xr-x 18 root root 256 Apr 28 08:27 .
dr-xr-xr-x 18 root root 256 Apr 28 08:27 ..
-rw-r--r-- 1 root root 0 Apr 22 20:10 .autorelabel
lrwxrwxrwx 1 root root 7 Dec 12 2024 bin -> usr/bin
dr-xr-xr-x 5 root root 295 Mar 20 18:13 boot
drwxr-xr-x 2 root root 6 Dec 12 2024 data
drwxr-xr-x 18 root root 13480 Apr 22 20:10 dev
drwxr-xr-x 94 root root 8192 Apr 25 22:10 etc
drwxr-xr-x 4 root root 35 Apr 22 20:11 home
lrwxrwxrwx 1 root root 7 Dec 12 2024 lib -> usr/lib
lrwxrwxrwx 1 root root 9 Dec 12 2024 lib64 -> usr/lib64
drwxr-xr-x 2 root root 6 Dec 12 2024 media
drwxr-xr-x 2 root root 6 Dec 12 2024 mnt
drwxr-xr-x 2 root root 6 Dec 12 2024 opt
dr-xr-xr-x 197 root root 0 Apr 22 20:10 proc
dr-xr-x--- 5 root root 216 Apr 27 22:52 root
drwxr-xr-x 35 root root 1160 Apr 22 20:11 run
lrwxrwxrwx 1 root root 8 Dec 12 2024 sbin -> usr/sbin
drwxr-xr-x 2 root root 6 Dec 12 2024 srv
dr-xr-xr-x 12 root root 0 Apr 22 20:10 sys
drwxrwxrwt 8 root root 4096 Apr 28 08:27 tmp #系统自带的临时文件夹
drwxr-xr-x 13 root root 155 Apr 25 12:50 usr
drwxr-xr-x 20 root root 4096 Jul 4 2025 var
[root@VM-0-9-opencloudos /]#
2.3如何设置粘滞位
使用chmod命令,通过+t参数为指定目录添加粘滞位:
cpp
#赋予目录粘滞位权限
chmod +t [目录名]
cpp
[root@VM-0-9-opencloudos /]# mkdir _template
[root@VM-0-9-opencloudos /]# ls -al
total 20
dr-xr-xr-x 19 root root 273 Apr 28 08:34 .
dr-xr-xr-x 19 root root 273 Apr 28 08:34 ..
-rw-r--r-- 1 root root 0 Apr 22 20:10 .autorelabel
lrwxrwxrwx 1 root root 7 Dec 12 2024 bin -> usr/bin
dr-xr-xr-x 5 root root 295 Mar 20 18:13 boot
drwxr-xr-x 2 root root 6 Dec 12 2024 data
drwxr-xr-x 18 root root 13480 Apr 22 20:10 dev
drwxr-xr-x 94 root root 8192 Apr 25 22:10 etc
drwxr-xr-x 4 root root 35 Apr 22 20:11 home
lrwxrwxrwx 1 root root 7 Dec 12 2024 lib -> usr/lib
lrwxrwxrwx 1 root root 9 Dec 12 2024 lib64 -> usr/lib64
drwxr-xr-x 2 root root 6 Dec 12 2024 media
drwxr-xr-x 2 root root 6 Dec 12 2024 mnt
drwxr-xr-x 2 root root 6 Dec 12 2024 opt
dr-xr-xr-x 190 root root 0 Apr 22 20:10 proc
dr-xr-x--- 5 root root 216 Apr 27 22:52 root
drwxr-xr-x 35 root root 1160 Apr 22 20:11 run
lrwxrwxrwx 1 root root 8 Dec 12 2024 sbin -> usr/sbin
drwxr-xr-x 2 root root 6 Dec 12 2024 srv
dr-xr-xr-x 12 root root 0 Apr 28 08:27 sys
drwxrwxrwx 2 root root 6 Apr 28 08:34 _template #权限全部放开,所有人都可以一删除,这是不可以的。
drwxrwxrwt 7 root root 4096 Apr 28 08:31 tmp
drwxr-xr-x 13 root root 155 Apr 25 12:50 usr
drwxr-xr-x 20 root root 4096 Jul 4 2025 var
[root@VM-0-9-opencloudos /]# chmod +t _template
[root@VM-0-9-opencloudos /]# ls -l _template
total 0
[root@VM-0-9-opencloudos /]# ls -al
total 20
dr-xr-xr-x 19 root root 273 Apr 28 08:34 .
dr-xr-xr-x 19 root root 273 Apr 28 08:34 ..
-rw-r--r-- 1 root root 0 Apr 22 20:10 .autorelabel
lrwxrwxrwx 1 root root 7 Dec 12 2024 bin -> usr/bin
dr-xr-xr-x 5 root root 295 Mar 20 18:13 boot
drwxr-xr-x 2 root root 6 Dec 12 2024 data
drwxr-xr-x 18 root root 13480 Apr 22 20:10 dev
drwxr-xr-x 94 root root 8192 Apr 25 22:10 etc
drwxr-xr-x 4 root root 35 Apr 22 20:11 home
lrwxrwxrwx 1 root root 7 Dec 12 2024 lib -> usr/lib
lrwxrwxrwx 1 root root 9 Dec 12 2024 lib64 -> usr/lib64
drwxr-xr-x 2 root root 6 Dec 12 2024 media
drwxr-xr-x 2 root root 6 Dec 12 2024 mnt
drwxr-xr-x 2 root root 6 Dec 12 2024 opt
dr-xr-xr-x 190 root root 0 Apr 22 20:10 proc
dr-xr-x--- 5 root root 216 Apr 27 22:52 root
drwxr-xr-x 35 root root 1160 Apr 22 20:11 run
lrwxrwxrwx 1 root root 8 Dec 12 2024 sbin -> usr/sbin
drwxr-xr-x 2 root root 6 Dec 12 2024 srv
dr-xr-xr-x 12 root root 0 Apr 28 08:27 sys
drwxrwxrwt 2 root root 6 Apr 28 08:34 _template
drwxrwxrwt 7 root root 4096 Apr 28 08:31 tmp
drwxr-xr-x 13 root root 155 Apr 25 12:50 usr
drwxr-xr-x 20 root root 4096 Jul 4 2025 var
[root@VM-0-9-opencloudos /]#
由此,加上粘滞位之后,所有人都可以读可以写,但是只能删除自己创建的文件,同时删除整个目录的权限集中在拥有者上,当然root依旧想干什么干什么
粘滞位虽然看起来像是只给others加了,实际上是针对所有非文件的所有者,包括所属组
|--------------------|-----------|-------|--------------|
| 角色 | 读写权限(r,w) | 执行权限x | 删除权限 |
| 文件所有者 | 正常 | 正常 | 可以删除自己的文件 |
| 普通成员(others,Group) | 正常 | 正常 | 不允许删除其他人的文件 |
| 目录所有者 | 正常 | 正常 | 可以删除目录下的任何文件 |
| root | 无限制 | 无限制 | 无限制 |