解析Linux从umask位运算到粘滞位

一.解析缺省权限与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 | 无限制 | 无限制 | 无限制 |

相关推荐
江屿风2 小时前
【Linux系统】【Linux进程终止等待详解与程序替换机制初体验】流食般投喂
linux·运维·笔记·系统架构·centos·unix
螺蛳粉 螺蛳粉2 小时前
CentOS 7.9 自建 Yum 源服务器搭建指南
linux·服务器·centos
吴声子夜歌3 小时前
Shell编程实例——脚本编程的附加特性
linux·运维·shell
yunwei373 小时前
eBPF 教程:BPF 调度器入门
linux·后端·性能优化
byte轻骑兵3 小时前
【BlueZ 】sdp 模块:服务发现协议的用户态实现基础
linux·人工智能·bluez·电脑蓝牙·嵌入式蓝牙
赴生-3 小时前
Liunx 操作系统 进程控制(上)
linux
傲世仙尊3 小时前
从.o到ELF-静态库动态库与可执行文件的生命周期
linux
指尖的爷3 小时前
【地狱级难度】ubuntu系统GOCV编译安装
linux·运维·ubuntu
xx~t3 小时前
嵌入式——ARM——汇编2
linux·汇编·arm开发·嵌入式硬件·启动代码