权限管理
权限管理
[TOC]
01.文件权限
📌 准备两个窗口
- root — 管理员
- oldboy — 普通用户
rw- r-- r--九位权限位置
- r: read
- 可读 cat less head tail
- w: write
- 可写 vim echo sed
- x: execute
- 可执行 普通文件不需要x权限
- 文件中是可执行命令的时候才需要有x权限
📌 每3位为一组
rw-— 前三位对应着文件属主的权限r--— 中三位对应着属组的权限r--— 后三位对应着陌生人的权限
[root@oldboy ~]# touch /home/oldboy.txt# root用户进行创建[oldboy@oldboy ~]$ ll /home/oldboy.txt-rw-r--r-- 1 root root 9 Dec 18 16:07 /home/oldboy.txt# oldboy用户进行查看问: 我对oldboy.txt拥有什么权限?
(1)我是谁
[oldboy@oldboy ~]$# 当前登录的用户是oldboy(2)找出我和文件的关系
oldboy用户对于这个文件,既不是属主,也不是属组,那关系就只能是陌生人
(3)通过关系找到对应的权限位置
陌生人对应的权限位置是后三位 r—
只读权限
02.授权
chmod
chmod 是 “change mode” 的缩写 mode = 权限模式 chmod 命令用于更改文件或目录的权限模式(mode)
chown 是 “change owner” 的缩写 owner = 主人 chown 命令用于更改文件或目录的属主(owner)和属组(group)
📌 语法结构:
chmod ugo file # 方法1chmod 数字 file # 方法2⚠️ 参数选项:
chmod -R 644 # 基本不用- 修改目录及目录下所有文件为644
- 目录和目录下的文件,通常来讲它们的权限是不一样的
- 如果仅修改文件,先用
find 绝对路径 -type f查找,配合xargs修改
-R 递归修改权限
ugo
📌 使用ugo方式进行授权
u— 表示前三位权限位属主
g— 表示中三位权限位属组
o— 表示其他位权限位陌生人
a— 表示所有位置all 所有
chmod +x 1.txt # 所有位加x权限chmod +w 1.txt # 只为属主加w权限 -- 只有它是特殊+(加)
🌰 案例:给1.txt属主增加x权限
[root@oldboyedu ~]# chmod u+x 1.txt[root@oldboyedu ~]# ll 1.txt-rwxr--r-- 1 root root 0 Nov 13 10:16 1.txt🌰 案例:给属主和属组增加x权限
[root@oldboyedu ~]# ll 1.txt--w-r--r-- 1 root root 0 Nov 13 10:16 1.txt[root@oldboyedu ~]# chmod ug+x 1.txt[root@oldboyedu ~]# ll 1.txt--wxr-xr-- 1 root root 0 Nov 13 10:16 1.txt🌰 案例:给所有位置增加w权限
[root@oldboyedu ~]# chmod a+w 1.txt[root@oldboyedu ~]# ll 1.txt--wxrwxrw- 1 root root 0 Nov 13 10:16 1.txt-(减)
🌰 案例:给1.txt属主去掉w权限
[root@oldboyedu ~]# chmod u-w 1.txt[root@oldboyedu ~]# ll 1.txt-r-xr--r-- 1 root root 0 Nov 13 10:16 1.txt🌰 案例:同时去掉r和x权限
[root@oldboyedu ~]# chmod u-rx 1.txt[root@oldboyedu ~]# ll 1.txt--w-r--r-- 1 root root 0 Nov 13 10:16 1.txt# 可同时去掉多个🌰 案例:所有位置去掉w权限
[root@oldboyedu ~]# chmod a-w 1.txt[root@oldboyedu ~]# ll 1.txt---xr-xr-- 1 root root 0 Nov 13 10:16 1.txt=(赋值)
🌰 案例:给1.txt属主授权为r权限
[root@oldboyedu ~]# chmod u=r 1.txt[root@oldboyedu ~]# ll 1.txt-r--r--r-- 1 root root 0 Nov 13 10:16 1.txt# 可加一个或者多个[root@oldboyedu ~]# chmod u=rwx 1.txt[root@oldboyedu ~]# ll 1.txt-rwxr--r-- 1 root root 0 Nov 13 10:16 1.txt+w 的特殊性
⚠️ 只为属主加w权限 — 只有它是特殊
[root@oldboyedu ~]# chmod +x 1.txt[root@oldboyedu ~]# ll 1.txt---xr-xr-x 1 root root 0 Nov 13 10:16 1.txt[root@oldboyedu ~]# chmod +r 1.txt[root@oldboyedu ~]# ll 1.txt-r-xr-xr-x 1 root root 0 Nov 13 10:16 1.txt[root@oldboyedu ~]# chmod +w 1.txt[root@oldboyedu ~]# ll 1.txt-rwxr-xr-x 1 root root 0 Nov 13 10:16 1.txt# 只有属主有w权限数字
# 使用数字方式进行授权r # 读 4w # 写 2x # 执行 1# 授权时、将每三位的位置进行相加然后进行授权🌰 案例:授权1.txt权限为 rwxr—r—
rwx = 4+2+1 = 7r-- = 4+0+0 = 4r-- = 4+0+0 = 4[root@oldboyedu ~]# chmod 744 1.txt[root@oldboyedu ~]# ll 1.txt-rwxr--r-- 1 root root 0 Nov 13 10:16 1.txt🌰 案例:授权1.txt权限为 rw-------
[root@oldboyedu ~]# chmod 600 1.txt[root@oldboyedu ~]# ll 1.txt-rw------- 1 root root 0 Nov 13 10:16 1.txt🌰 案例:授权1.txt权限为 rwxrwxrwx
⚠️ 企业工作中禁止授权777
[root@oldboyedu ~]# chmod 777 1.txt[root@oldboyedu ~]# ll 1.txt-rwxrwxrwx 1 root root 0 Nov 13 10:16 1.txt03.umask
📌 作用: 控制系统默认创建文件和目录的权限(了解)
- 系统默认创建的文件权限:
644 - 系统默认创建的目录权限:
755
目录每一位多加了个x,也就是可以cd进入到目录中
[root@oldboyedu ~]# touch a.txt[root@oldboyedu ~]# mkdir oldboy[root@oldboyedu ~]# lltotal 0-rw-r--r-- 1 root root 0 Nov 13 10:34 a.txt# 文件644drwxr-xr-x 2 root root 6 Nov 13 10:34 oldboy# 目录755📌 查看umask
[root@oldboyedu ~]# umask0022📌 使用文件的最大权限减去默认的umask 022 得到的是 644
- 文件最大权限: 666 — 文件可读可写
666-022=644📌 使用目录的最大权限减去默认的umask 022 得到的是 755
- 目录最大权限: 777 — 目录最大权限
777-022=755操作
[root@oldboyedu ~]# umask 044[root@oldboyedu ~]# umask0044# 修改umask[root@oldboyedu ~]# touch a.txt# 666# -044# =622 rw--w--w-# 操作文件,得到权限[root@oldboyedu ~]# mkdir oldboy# 777# -044# =733 rwx-wx-wx# 操作目录[root@oldboyedu ~]# lltotal 0-rw--w--w- 1 root root 0 Nov 13 10:37 a.txt# 622 匹配得上drwx-wx-wx 2 root root 6 Nov 13 10:37 oldboy# 733 也匹配得上⚠️ 注意:如果umask值为奇数,666减去后在奇数位加1,就是文件权限
- 目录权限不需要加
[root@oldboyedu ~]# umask 032[root@oldboyedu ~]# touch 1.txt# 666# -032# =634# 文件,奇数位+1# +010# =644# 是减完后再+1[root@oldboyedu ~]# mkdir oldboy# 777# -032# =745# 目录不发生改变✅ 验证:
[root@oldboyedu ~]# lltotal 0-rw-r--r-- 1 root root 0 Nov 13 10:40 1.txt# 644drwxr-xr-x 2 root root 6 Nov 13 10:40 oldboy# 74504.rwx含义
文件中
📌 rwx对于文件的含义:
准备两个窗口:
- root — 用来修改权限
- oldboy — 执行命令
📌 环境准备:
[root@oldboyedu ~]# mkdir /oldboy[root@oldboyedu ~]# touch /oldboy/{1..3}.txt[root@oldboyedu ~]# echo pwd > /oldboy/1.txt# 将pwd写入进去,写入的是字符# 当文件有rx权限,可以执行pwd命令# 只有x啥也干不了# 下文有详细解析[root@oldboyedu ~]# tree /oldboy//oldboy/├── 1.txt├── 2.txt└── 3.txt0 directories, 3 files[root@oldboyedu ~]# chown oldboy.oldboy /oldboy/*# 用root进行修改# 没有-R 只修改目录下所有文件的属主和属组# 并没有修改目录的属主和属组!!![root@oldboyedu ~]# ll /oldboy/total 4-rw-r--r-- 1 oldboy oldboy 4 Nov 13 10:44 1.txt-rw-r--r-- 1 oldboy oldboy 0 Nov 13 10:43 2.txt-rw-r--r-- 1 oldboy oldboy 0 Nov 13 10:43 3.txt# 文件的默认权限是644📌 开始测试
[root@oldboyedu oldboy]# chmod u=r 1.txt# root修改权限[root@oldboyedu oldboy]# ll 1.txt-r--r--r-- 1 oldboy oldboy 4 Nov 13 10:44 1.txtoldboy测试 这些都是在oldboy用户下进行测试的
测试结果:
r— 只读、其他什么权限都没有
- 只要文件能让看,就能让我cp复制
w— 啥都不能干
- 可以追加
>>,vim不生效- 看都不让看,追加也没有意义!
x— 啥都不能干
- 同上,单拎x没有意义!
文件中的 r、w、x 并不是我们想象中的那样: 只要有w就可以写? 只要有x就可以执行?
📌 常见组合 — 它们通常是配合着来用的:
r— 单独使用表示只读- 可cp复制文件
rw— 对文件可读可写、文件的最高权限rx— 可以执行文件中的命令- 可以执行pwd命令,它就不再是字符了
- 如果只是想要执行,不需要有w写的权限!
rwx— 说明可读可写可执行的脚本文件
既然1.txt已经是oldboy的了,那我们可以对它进行别的操作吗?
这又是为什么呢???
📌 目录的权限决定了我们用户是否可以在里面创建、删除、改名的动作
- 目录是由root创建的,所属主为root
- 它的默认目录的权限是755
- oldboy是陌生人,拥有 r-x 权限
- 而上面对于目录下文件的操作(创建、删除、改名),主要是目录的 w 权限在控制
- 因为陌生人oldboy没有目录的 w 权限,自然无法执行以上操作
[root@oldboy home]# ll -d /rootdr-xr-x--- 5 root root 248 Dec 18 16:07 /root# /root目录不是默认的权限755目录中
📌 环境修改:
[root@oldboyedu ~]# chown oldboy.oldboy /oldboy# 修改/oldboy目录的属组和属组为oldboy[root@oldboyedu ~]# ll -d /oldboydrwxr--r-x 2 oldboy oldboy 45 Nov 13 10:43 /oldboy# 这次是目录修改目录权限进行测试:
[root@oldboyedu oldboy]# chmod u=r /oldboy# 修改权限用root[root@oldboyedu oldboy]# ll -d /oldboydr--r--r-x 2 oldboy oldboy 45 Nov 13 10:43 /oldboy目录的权限
r— 单独一个r,啥都不能干
- 主要管理目录下的文件是否能够被ls查看!
w— 单独一个w,啥都不能干
- 主要管理目录下的文件是否能被rm删除、touch/echo创建、mv改名
x— 单独一个x,只能进入到目录、其他啥也不能干
- 这个x是管理是否能够进入到目录里面
- 文件是否能够执行,需要查看对应的文件是否有x权限,而并非是目录的x权限
- 文件仅有x权限,啥也干不了
wx— 能进去,目录下的文件能被创建、删除、改名
- 但是没有目录的r权限,你ls看不见目录下的文件
- 是否能cat查看,取决于文件本身,而并非目录
📌 常见的两种组合:
r-x— 所有用户都可以进入此目录- 可以ls查看目录下的内容
- 对于文件里面的内容是否能查看,取决于文件本身的r权限
- 不能创建、删除、改名(没有目录w权限)
rwx— 目录的最高控制权限- 可ls查看目录下的文件
- 可创建、删除和改名目录下的文件
- 可cd进入到目录里面
- 关于具体文件内容的查看r、文件内容的修改w、文件的执行x,还得看具体的文件权限!!!
📌 权限问题:找出确定的权限位少了啥???
# 在oldboy用户下执行# 文件默认权限为 rw-r--r-- 644# 目录默认权限为 rwxr-xr-x 755# 这里oldboy为这些目录的陌生人,只需看后三位权限即可!!!
touch /etc/a.txt# oldboy没有/etc目录的w权限,目录rwx可创建,故无法在/etc/目录下创建文件
echo aaa >> /etc/passwd# oldboy只有这个文件的r权限,缺少文件的w权限,文件rw可修改!没有办法修改文件的内容
cd /root/# 没有/root/目录的x权限,目录rwx可进入
[root@oldboy home]# ll -d /rootdr-xr-x--- 5 root root 248 Dec 18 16:07 /root# /root目录不是默认的权限755虚拟用户启动服务
为什么启动服务需要用虚拟用户,不能使用root启动?

- root创建一个
/code目录,属主属组都是root - 下面的
1.txt和/code/uploads都是root用户创建的
先不修改目录和文件的属主及权限
同时web的启动用户是root,那我们访问这个web的时候,是以root权限进行访问的
root的权限太大了
此时,用户在 /code/uploads 目录上传进来一个照片,带有病毒 rm -rf /*
- 又不小心执行了,那么整个系统就都崩了!
因为我们的启动用户是root
📌 所以我们通常用虚拟普通用户来启动服务!
- 先修改
/code/uploads目录的属主和属组为oldboy - 默认目录权限为755
- 这样的话,oldboy就可以在里面创建文件了
- 更改启动用户为oldboy
- oldboy本身权限就很小
- oldboy用户在
/code/uploads执行rm -rf /*命令 - 只能删除
/code/uploads里面的文件(是uploads目录的属主,拥有rwx权限7) - 有备份,可以进行数据恢复!
- 不能删除
/code/1.txt文件(/code目录属主是root,并且陌生人只有rx权限,没有w,不能删除) - 更不会对
/根下的其他目录文件造成威胁!
05.隐藏权限
lsattr
查看隐藏权限
[root@oldboyedu ~]# touch 1.txt[root@oldboyedu ~]# lltotal 0-rw-r--r-- 1 root root 0 Nov 13 11:32 1.txt[root@oldboyedu ~]# lsattr 1.txt-------------------- 1.txt# 空的说明没有隐藏权限!chattr
设置隐藏权限
a— 只能echo>>追加内容、cat查看文件内容,其他啥都不能干i— 只能cat查看文件内容,相当于锁住文件,啥都不能干
[root@oldboyedu ~]# chattr +a 1.txt[root@oldboyedu ~]# lsattr 1.txt-----a-------------- 1.txt
测试使用:
- 除了
echo>>追加内容、cat查看文件内容,其他啥都不能干
# 禁止的操作:echo "overwrite" > test.log # ❌ 失败:Operation not permittedrm test.log # ❌ 失败vim test.log # ❌ 无法保存(因为 vim 试图覆盖)- ⚠️ 即使你是root用户,你也不能随意rm删除、vim编辑
- 想要有别的、其他的操作,必须先去掉隐藏权限
[root@oldboyedu ~]# chattr -a 1.txti 锁住
- 只能cat查看文件内容,相当于锁住文件,啥都不能干
- ⚠️ root用户也不行
- 想要操作得先
-i解锁

06.特殊权限
📌 权限位: 12位
SUID
- 授权命令为 s 权限、u+s
- 一般用于命令文件
- 则所有的用户执行命令时候拥有命令属主的权限
- 属主有什么权限,你就有什么权限
[root@oldboyedu ~]# ll /usr/bin/rm-rwxr-xr-x 1 root root 67840 Apr 21 2022 /usr/bin/rm
[root@oldboyedu ~]# chmod u+s /usr/bin/rm[root@oldboyedu ~]# ll /usr/bin/rm-rwsr-xr-x 1 root root 67840 Apr 21 2022 /usr/bin/rm
[root@oldboyedu ~]# stat /usr/bin/rm File: '/usr/bin/rm' Size: 67840 Blocks: 136 IO Block: 4096 regular fileDevice: fd00h/64768d Inode: 67357941 Links: 1Access: (4755/-rwsr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)Access: 2025-11-12 14:38:56.811460805 +0800Modify: 2022-04-21 15:20:32.000000000 +0800Change: 2025-11-13 11:41:02.479001213 +0800 Birth: -# 别的普通用户再执行rm的时候,就相当于这个文件的属主root在执行!
# 解除文件属主的s权限位:[root@oldboyedu ~]# chmod u-s /usr/bin/rmSGID
- 授权为
g+s - 修改属组,意义不大,和陌生人的权限一样,一般不动!
粘滞位
- 只能删除自己创建的文件(也就是属主为自己的文件)
- 授权为:
chmod 1777 chmod o+t只是前面变为1,后面两位没有修改- 因为目录默认权限为0755,
o+t只是前面多个1罢了!变为1755 - 1755说明陌生人只有 r-x 没有 w 权限,这样的话,陌生人都不能创建和删除文件
- 所以我们创建粘滞位为
chmod 1777 - 常见的应用:
/tmp目录(回收站)

| 特殊权限 | 数值 | 符号 | 作用对象 | 功能描述 |
|---|---|---|---|---|
| SUID | 4 | u+s | 可执行文件 | 用户以文件属主身份执行 |
| SGID | 2 | g+s | 可执行文件/目录 | 文件以属组身份执行;目录下新建文件继承目录属组 |
| Sticky | 1 | o+t | 目录 | 只有文件所有者/root能删除文件 |
| 字符 | 含义 |
|---|---|
| s | SUID 已设置 且 所有者有执行权限(x)→ 生效 |
| S | SUID 已设置 但 所有者没有执行权限(x)→ 未生效 |
💡 原因:SUID 只有在文件所有者具有执行权限时才真正生效。如果缺少 x,即使设置了 SUID,也不会起作用
特殊权限都是这个样子的!!!
⚠️ 规律:
- 若所有者有 x,则显示为小写 s
- 若所有者无 x,则显示为大写 S
# 特殊权限:SUID = 4000 # u+sSGID = 2000 # g+sSticky = 1000 # o+t
# 组合示例:4755 = rwsr-xr-x # SUID+7552755 = rwxr-sr-x # SGID+7551755 = rwxr-xr-t # Sticky+755🌰 需求:在系统中创建 /data 目录,这个目录所有的用户都可以在里面创建文件和删除自己的文件,但不能删除其他用户的
# 依旧是两个窗口,root和oldboy用户
# ===== 切root =====[root@oldboy /]# rm -rf /data[root@oldboy /]# mkdir /data[root@oldboy /]# ll -d /datadrwxr-xr-x 2 root root 6 Dec 19 11:58 /data[root@oldboy /]# echo aaa > /data/1.txt[root@oldboy /]# ll /data/1.txt-rw-r--r-- 1 root root 4 Dec 19 12:05 /data/1.txt
# ===== 切oldboy =====[oldboy@oldboy ~]$ cd /data[oldboy@oldboy data]$ lltotal 4-rw-r--r-- 1 root root 4 Dec 19 12:05 1.txt# 是因为目录的后三位有r和x权限,oldboy才能进入到这个目录,并查看目录下的内容
[oldboy@oldboy data]$ cat 1.txtaaa# 是因为这个文件后三位有r权限所以能够查看文件里面的内容!
[oldboy@oldboy data]$ echo bbb >> 1.txt-bash: 1.txt: Permission denied# 因为文件后三位只有r权限并没w权限,自然没有办法进行文件内容的修改
[oldboy@oldboy data]$ ./1.txt-bash: ./1.txt: Permission denied# 文件后三位没有x权限,没法执行!
[oldboy@oldboy data]$ touch 2.txttouch: cannot touch '2.txt': Permission denied[oldboy@oldboy data]$ rm -rf 1.txtrm: cannot remove '1.txt': Permission denied# 这里得看/data目录权限,目录后三位仅有r-x权限,没有w,不能进行文件的创建、删除!
# ===== 切root给/data目录后三位增加w权限 =====[root@oldboy /]# chmod o+w /data/[root@oldboy /]# ll -d /data/drwxr-xrwx 2 root root 19 Dec 19 12:05 /data/
# ===== 切oldboy =====[oldboy@oldboy data]$ touch 2.txt[oldboy@oldboy data]$ lltotal 4-rw-r--r-- 1 root root 4 Dec 19 12:05 1.txt-rw-r--r-- 1 oldboy oldboy 0 Dec 19 12:23 2.txt# 因为目录有了rwx权限,自然是可以对目录下的文件随意创建、rm删除# 可以删除自己的文件,也可以删除root的文件!!!# 是否可以删除文件和文件本身的权限没有关系,取决于目录的权限!# 2.txt的属主属组为oldboy,因为这个文件是oldboy用户创建的# 而1.txt的属主和属组为root
[oldboy@oldboy data]$ rm -rf 2.txt[oldboy@oldboy data]$ rm -rf 1.txt[oldboy@oldboy data]$ lltotal 0# 两个都能删掉了!那么如何规划不能删除别人的文件,而只能删除属主为自己的文件呢?
于是我们就引出了粘滞位:
# ===== 切root =====[root@oldboy /]# chmod 1777 /data[root@oldboy /]# stat /data File: '/data' Size: 6 Blocks: 0 IO Block: 4096 directoryDevice: fd00h/64768d Inode: 868706 Links: 2Access: (1777/drwxrwxrwt) Uid: ( 0/ root) Gid: ( 0/ root)Access: 2025-12-19 12:47:19.182280711 +0800Modify: 2025-12-19 12:23:55.283895328 +0800Change: 2025-12-19 12:55:20.482526180 +0800
[root@oldboy /]# touch /data/1.txt[root@oldboy /]# ll /data/1.txt-rw-r--r-- 1 root root 0 Dec 19 12:57 /data/1.txt
# ===== 切oldboy验证 =====[oldboy@oldboy data]$ touch 2.txt[oldboy@oldboy data]$ lltotal 0-rw-r--r-- 1 root root 0 Dec 19 12:57 1.txt-rw-r--r-- 1 oldboy oldboy 0 Dec 19 12:58 2.txt[oldboy@oldboy data]$ rm -rf 2.txt# 自己的文件,删除成功![oldboy@oldboy data]$ rm -rf 1.txtrm: cannot remove '1.txt': Operation not permitted# 别人的文件,删不掉!✅ 粘滞位生效那如果我们改变root属组为oldboy,同时用oldboy用户删除能成功吗?
# ===== 切root =====[root@oldboy /]# chown oldboy:oldboy /data/1.txt[root@oldboy /]# ll /data/1.txt-rw-r--r-- 1 oldboy oldboy 0 Dec 19 12:57 /data/1.txt
# ===== 切oldboy验证 =====[oldboy@oldboy data]$ rm -rf 1.txt[oldboy@oldboy data]$ lltotal 0# 能删除!因为文件属主变成了oldboy,oldboy可以删除自己的文件# 粘滞位只管"属主是不是自己",不看属组!07.ACL权限管理
# ACL:可以为单个用户或单个组设置特定权限基本命令
# (1)getfacl - 查看ACL权限'get f acl' # 查看ACL权限getfacl 目录名or文件名
# (2)setfacl - 设置ACL权限setfacl -m u:用户名:权限 filesetfacl -m g:组名:权限 file# -m 设置用户或者组的ACL
# 为用户设置无权限(明确拒绝)setfacl -m u:用户名:- file'后面跟的是- 无权限!'
# 删除特定用户的ACLsetfacl -x u:用户名 file'后面无需再跟: 一个:就够用了!'
# 清除所有ACL,恢复基本权限setfacl -b file
# (3)识别带有ACL的文件# 使用ls -l时,权限位后有+号表示该文件有ACL:-rw-rw-r--+ # 后面有+号!
# (4)复制文件的acl权限getfacl 1.txt | setfacl --set-file=- 2.txt# 等于号后面有个 - ,它是标准输入# --set-file 长选项赋值给 2.txtroot@rocky10:/test# touch 1.txt 2.txtroot@rocky10:/test# ll *.txt-rw-r--r--. 1 root root 0 Mar 6 08:51 1.txt-rw-r--r--. 1 root root 0 Mar 6 08:51 2.txtroot@rocky10:/test# setfacl -m u:test:rwx 1.txtroot@rocky10:/test# ll *.txt-rw-rwxr--+ 1 root root 0 Mar 6 08:51 1.txt-rw-r--r--. 1 root root 0 Mar 6 08:51 2.txtroot@rocky10:/test# getfacl 1.txt | setfacl --set-file=- 2.txt# 把1.txt的权限赋值给2.txtroot@rocky10:/test# getfacl 2.txt# file: 2.txt# owner: root# group: rootuser::rw-user:test:rwx# 这样2.txt也有了test用户的权限!group::r--mask::rwxother::r--ACL生效顺序
当系统检查权限时,按以下顺序匹配(一旦匹配成功即停止):
- 所有者(user::)
- 自定义用户(user:username:)— ACL
- 所属组(group::)或自定义组(group:groupname:)— ACL
- 其他人(other::)
用 getfacl,是可以直接查看出顺序的!
实验
[root@Rocky10 home]# mkdir test[root@Rocky10 home]# getfacl test# -------------------# file: test# owner: root# group: rootuser::rwxgroup::r-xother::r-x# 上面都是默认的权限,也就是ll -d显示出来的权限!# -------------------[root@Rocky10 home]# ll -d test/drwxr-xr-x. 2 root root 6 Mar 6 09:14 test/
[root@Rocky10 home]# useradd www[root@Rocky10 home]# id wwwuid=1000(www) gid=1000(www) groups=1000(www)# 使用www用户测试!!
[root@Rocky10 home]# setfacl -m u:www:r-x ./test/[root@Rocky10 home]# ll -d ./test/drwxr-xr-x+ 2 root root 6 Mar 6 09:14 ./test/# 后面有+号!'说明有ACL权限控制'
[root@Rocky10 home]# getfacl ./test/# file: test/# owner: root# group: rootuser::rwxuser:www:r-x # 在这里!group::r-xmask::r-x # 多了一个mask!!other::r-x
[root@Rocky10 home]# useradd hhh[root@Rocky10 home]# id hhhuid=1001(hhh) gid=1002(hhh) groups=1002(hhh)
[root@Rocky10 home]# chown hhh:hhh ./test/[root@Rocky10 home]# getfacl ./test/# file: test/# owner: hhh# group: hhhuser::rwxuser:www:r-x'即使修改属主属组,它也不会消失!'group::r-xmask::r-xother::r-x
[root@Rocky10 home]# chown root:root ./test/# 修改回来!
[root@Rocky10 home]# setfacl -m g:hhh:--x ./test/# 增加个别组的权限[root@Rocky10 home]# getfacl ./test/# file: test/# owner: root# group: rootuser::rwxuser:www:r-xgroup::r-xgroup:hhh:--x # 在这!mask::r-xother::r-x
[root@Rocky10 home]# setfacl -x g:hhh ./test# 删除组hhh的权限![root@Rocky10 home]# getfacl ./test/# file: test/# owner: root# group: rootuser::rwxuser:www:r-xgroup::r-x # 没有组hhh的权限了!mask::r-xother::r-x
[root@Rocky10 home]# setfacl -b ./test/# 清空默认的ACL控制列表'命令是setfacl了,并不是getfacl,它是用来查看的!'
# getfacl 测试 -b 选项(注意:getfacl没有-b选项!)[root@Rocky10 home]# getfacl -b ./test/getfacl: invalid option -- 'b'Usage: getfacl [-aceEsRLPtpndvh] file ...Try `getfacl --help' for more information.
[root@Rocky10 home]# getfacl ./test/# file: test/# owner: root# group: rootuser::rwxgroup::r-xother::r-xmask的值
# mask的值并不限制属主(owner)和 others 的权限,# 它只限制所有命名用户(named users)、所属组(owning group)# 以及命名组(named groups)的有效权限(effective permissions)。
# 也就是说:# user::(文件属主) → 不受 mask 影响# other::(其他人) → 不受 mask 影响# group::(文件所属组) → 受 mask 限制# group:hhh:(命名组) → 受 mask 限制# user:xxx:(命名用户) → 也受 mask 限制[root@Rocky10 home]# getfacl 1.txt# file: 1.txt# owner: root# group: rootuser::rw-group::r--group:hhh:r--mask::r-- '现在是r--'other::r--
[root@Rocky10 home]# setfacl -m m::- 1.txt# -m选项!!!# m:留空:-# 这里我设置的是-没有任何权限,实际上默认设置即可
[root@Rocky10 home]# getfacl 1.txt# 再次查看!# file: 1.txt# owner: root# group: rootuser::rw- '没有变'group::r-- #effective:--- '实际有效'group:hhh:r-- #effective:--- '实际有效'mask::--- '改为---'other::r-- '没有变'📋 练习任务
准备工作
# 以root身份执行以下准备命令[root@Rocky10 ~]# groupadd dev[root@Rocky10 ~]# groupadd testgroupadd: group 'test' already exists[root@Rocky10 ~]# useradd -m -G dev alice # 开发部员工[root@Rocky10 ~]# useradd -m -G dev bob # 开发部员工[root@Rocky10 ~]# useradd -m -G test carol # 测试部员工[root@Rocky10 ~]# useradd -m -G test dave # 测试部员工[root@Rocky10 ~]# mkdir -p /company/{dev_share,test_share,public,scripts}[root@Rocky10 ~]# tree /company//company/├── dev_share├── public├── scripts└── test_share5 directories, 0 files任务一:基础权限设置(chmod)
📌 目标:配置开发部共享目录,使部门成员可以协作,但禁止其他部门访问
要求:
(1) 设置 /company/dev_share 的权限为:rwxrwx---
[root@Rocky10 ~]# chmod 770 /company/dev_share/[root@Rocky10 ~]# ll -d /company/dev_share/drwxrwx---. 2 root root 6 Mar 5 13:12 /company/dev_share/(2) 确保只有 dev 组的成员能进入该目录
[root@Rocky10 ~]# chown -R :dev /company/dev_share/[root@Rocky10 ~]# ll -d /company/dev_share/drwxrwx---. 2 root dev 6 Mar 5 13:12 /company/dev_share/(3) 创建文件 project.txt,设置权限为 rw-rw----(部门成员可读写,其他人无权限)
[root@Rocky10 ~]# touch /company/dev_share/project.txt[root@Rocky10 ~]# ll -d /company/dev_share/project.txt-rw-r--r--. 1 root root 0 Mar 5 13:57 /company/dev_share/project.txt[root@Rocky10 ~]# chmod 660 /company/dev_share/project.txt[root@Rocky10 ~]# ll -d /company/dev_share/project.txt-rw-rw----. 1 root root 0 Mar 5 13:57 /company/dev_share/project.txt[root@Rocky10 ~]# chown :dev /company/dev_share/project.txt[root@Rocky10 ~]# ll -d /company/dev_share/project.txt-rw-rw----. 1 root dev 0 Mar 5 13:57 /company/dev_share/project.txt✅ 验证命令:
[root@Rocky10 ~]# su - alice -c "touch /company/dev_share/alice_file.txt" # 应该成功[root@Rocky10 ~]# su - carol -c "ls /company/dev_share" # 应该失败(权限拒绝)ls: cannot open directory '/company/dev_share': Permission denied任务二:所有权管理(chown + chgrp)
📌 目标:正确设置文件所有者和所属组,确保部门隔离
要求:
(1) 将 /company/dev_share 的所属组改为 dev
[root@Rocky10 ~]# ll -d /company/dev_share/drwxrwx---. 2 root dev 47 Mar 5 14:00 /company/dev_share/(2) 创建用户 manager 作为部门经理,将 project.txt 的所有者改为 manager
[root@Rocky10 ~]# useradd manager[root@Rocky10 ~]# ll /company/dev_share/project.txt-rw-rw----. 1 root dev 0 Mar 5 13:57 /company/dev_share/project.txt[root@Rocky10 ~]# chown manager:manager /company/dev_share/project.txt[root@Rocky10 ~]# ll /company/dev_share/project.txt-rw-rw----. 1 manager manager 0 Mar 5 13:57 /company/dev_share/project.txt(3) 确保 manager 可以读写,但 manager 不属于 dev 组时不能通过组权限访问
su - manager -c "echo manager > /company/dev_share/project.txt"su - manager -c "cat /company/dev_share/project.txt"[root@Rocky10 ~]# ll -d /company/dev_share/drwxrwx---. 2 root dev 47 Mar 5 14:00 /company/dev_share/# 目录属组仍是dev'这里注意一点,就是other是没有x权限,也就是别人压根进不去这个目录中'
# 给目录other位加上x权限:[root@Rocky10 ~]# ll -d /company/dev_share/drwxrwx--x. 2 root dev 47 Mar 5 14:00 /company/dev_share/[root@Rocky10 ~]# su - manager -c "echo manager > /company/dev_share/project.txt"[root@Rocky10 ~]# su - manager -c "cat /company/dev_share/project.txt"manager# 这个时候既能够写入,又能够查看文件里面的内容了!🌰 进阶:使用 chown 一次性同时修改所有者和所属组(提示:chown user:group file)
[root@Rocky10 ~]# ll -d /company/dev_share/drwxrwx--x. 2 root dev 47 Mar 5 14:00 /company/dev_share/[root@Rocky10 ~]# chown -R manager:manager /company/dev_share/[root@Rocky10 ~]# ll -d /company/dev_share/drwxrwx--x. 2 manager manager 47 Mar 5 14:00 /company/dev_share/任务三:SGID 特殊权限(g+s)
📌 目标:确保开发部成员创建的文件自动继承 dev 组身份,方便协作
要求:
(1) 为 /company/dev_share 设置 SGID 权限
[root@Rocky10 ~]# chown -R root:dev /company/dev_share/[root@Rocky10 ~]# ll -d /company/dev_share/drwxrwx--x. 2 root dev 47 Mar 5 14:00 /company/dev_share/# 先把它改回来![root@Rocky10 ~]# chmod g+s /company/dev_share/[root@Rocky10 ~]# ll -d /company/dev_share/drwxrws--x. 2 root dev 47 Mar 5 14:00 /company/dev_share/(2) 切换到 alice 身份,在该目录下创建文件 shared_code.sh
(3) 验证该文件的所属组是否为 dev(而非 alice 的主组)
[root@Rocky10 ~]# id aliceuid=1001(alice) gid=1002(alice) groups=1002(alice),1001(dev)[root@Rocky10 ~]# su - alice -c "touch /company/dev_share/shared_code.sh"[root@Rocky10 ~]# ll /company/dev_share/shared_code.sh-rw-r--r--. 1 alice dev 0 Mar 5 14:36 /company/dev_share/shared_code.sh# 属主为alice,但是属组为dev ✅📌 关键问题:如果不设置 SGID,alice 创建的文件默认属于哪个组?如何查看?
'属于alice的主组,也就是它自己!'[root@Rocky10 ~]# ll -d /home/alice/drwx------. 4 alice alice 92 Mar 5 14:00 /home/alice/[root@Rocky10 ~]# su - alice -c "touch /home/alice/test.txt"[root@Rocky10 ~]# ll /home/alice/test.txt-rw-r--r--. 1 alice alice 0 Mar 5 14:42 /home/alice/test.txt# 属组是 alice(主组),不是 dev任务四:Sticky Bit 特殊权限(o+t)
📌 目标:创建公共交换区,允许所有人上传文件,但只能删除自己的文件
📌 场景:/company/public 作为部门间文件交换区
要求:
(1) 设置目录权限为 777,并添加 Sticky Bit
[root@Rocky10 ~]# ll -d /company/public/drwxr-xr-x. 2 root root 6 Mar 5 13:12 /company/public/[root@Rocky10 ~]# chmod 1777 /company/public/[root@Rocky10 ~]# ll -d /company/public/drwxrwxrwt. 2 root root 6 Mar 5 13:12 /company/public/# 有小t ✅(2) alice 创建文件 to_test.txt
[root@Rocky10 ~]# su - alice -c "touch /company/public/to_test.txt"[root@Rocky10 ~]# ll /company/public/to_test.txt-rw-r--r--. 1 alice alice 0 Mar 5 14:57 /company/public/to_test.txt(3) carol(测试部)尝试删除该文件 — 应该失败
[root@Rocky10 ~]# id caroluid=1003(carol) gid=1004(carol) groups=1004(carol),1000(test)[root@Rocky10 ~]# su - carol -c "rm -rf /company/public/to_test.txt"rm: cannot remove '/company/public/to_test.txt': Operation not permitted# ❌ 删不掉别人的文件!(4) carol 可以创建自己的文件 from_test.txt
(5) 只有 root 和文件所有者能删除文件
[root@Rocky10 ~]# su - carol -c "touch /company/public/from_test.txt"[root@Rocky10 ~]# ll /company/public/from_test.txt-rw-r--r--. 1 carol carol 0 Mar 5 15:01 /company/public/from_test.txt
# 测试删除部分![root@Rocky10 ~]# su - alice -c "rm -rf /company/public/from_test.txt"rm: cannot remove '/company/public/from_test.txt': Operation not permitted# alice 尝试删除carol的文件,删除不掉!
[root@Rocky10 ~]# su - carol -c "rm -rf /company/public/from_test.txt"[root@Rocky10 ~]# ll /company/public/from_test.txtls: cannot access '/company/public/from_test.txt': No such file or directory# 自己可以删除自己的文件!✅
[root@Rocky10 ~]# rm -rf /company/public/*[root@Rocky10 ~]# ll /company/public/total 0# root随便删除!✅任务五:SUID 特殊权限(u+s)⭐进阶
📌 目标:创建一个只允许特定组使用的管理脚本
📌 场景:/company/scripts/backup.sh 需要以 root 权限执行备份,但只允许 dev 组成员使用
要求:
创建脚本:
cat > /company/scripts/backup.sh <<EOF#!/bin/bashecho "Backup started by: \$(whoami)"tar czf /tmp/backup_\$(date +%Y%m%d).tar.gz /company/dev_share 2>/dev/nullecho "Backup completed: /tmp/backup_\$(date +%Y%m%d).tar.gz"EOF'直接复制粘贴即可!!!'(1) 设置脚本权限:rwxr-x---(仅所有者和组可执行)
[root@Rocky10 ~]# chmod 750 /company/scripts/backup.sh[root@Rocky10 ~]# ll /company/scripts/backup.sh-rwxr-x---. 1 root root 192 Mar 5 15:09 /company/scripts/backup.sh(2) 设置 SUID 权限,使脚本始终以所有者(root)身份运行
[root@Rocky10 ~]# chmod u+s /company/scripts/backup.sh[root@Rocky10 ~]# ll /company/scripts/backup.sh-rwsr-x---. 1 root root 192 Mar 5 15:09 /company/scripts/backup.sh# 前面有一个小s(3) 所属组设为 dev,确保只有开发部成员能执行
[root@Rocky10 ~]# chown :dev /company/scripts/backup.sh[root@Rocky10 ~]# ll /company/scripts/backup.sh-rwxr-x---. 1 root dev 192 Mar 5 15:09 /company/scripts/backup.sh
# 测试部分[root@Rocky10 ~]# ll -d /company/scripts/drwxr-xr-x. 2 root root 23 Mar 5 15:09 /company/scripts/[root@Rocky10 ~]# su - carol -c "sh /company/scripts/backup.sh"sh: /company/scripts/backup.sh: Permission denied# carol测试人员不允许访问!!❌[root@Rocky10 ~]# su - alice -c "sh /company/scripts/backup.sh"Backup started by: rootBackup completed: /tmp/backup_20260305.tar.gz# alice开发人员成功访问✅📌 安全思考:为什么 SUID 脚本有安全风险?实际生产环境中应该用什么替代方案?
文件所有者一般都是root(root来创建),要是脚本都以root身份运行风险太大了,root权限太高,万一有人篡改脚本里面的内容,就全完了!!!
替代方案:
- 使用 sudo 精细授权 — 通过 sudoers 文件授权特定用户执行特定命令
- 调整文件/目录权限或组策略
任务六:综合权限计算
📌 根据以下权限字符串,写出对应的数字模式和符号模式:
| 权限显示 | 数字模式 | 符号模式 | 说明 |
|---|---|---|---|
-rwsr-xr-x | 4755 | set uid | 可执行文件带SUID |
drwxrwsr-x | 2775 | set gid | 目录带SGID |
drwxrwxrwt | 1777 | 粘滞位 | 临时目录带Sticky |
-rwSr--r-- | 4644 | set uid | SUID设置但无执行权限(大写S) |
权限数字速查表
r = 4, w = 2, x = 1
# 特殊权限:SUID = 4000 # u+sSGID = 2000 # g+sSticky = 1000 # o+t
# 组合示例:4755 = rwsr-xr-x # SUID+7552755 = rwxr-sr-x # SGID+7551755 = rwxr-xr-t # Sticky+755文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!




