一、Linux 12 位权限体系中的特殊权限¶
除了常见的 9 位基础权限,Linux 还支持 3 位特殊权限,分别是 SUID、SGID 和 Sticky。它们主要用于控制程序执行身份、协作目录权限以及共享目录下文件删除行为。
1.1 用户 ID(SUID)¶
设置用户 ID(SUID)是一种特殊权限标志,适用于可执行文件。它允许普通用户在运行特定程序时获得程序所有者的权限,而不是自己的权限。
SUID 常用于允许普通用户执行一些需要特权的操作,例如修改密码或执行某些系统相关任务。
- SUID 在权限位中通常显示为
s或S - 对应的权限数字是
4 - 如果文件所有者包含执行权限,则显示为小写
s - 如果文件所有者不包含执行权限,则显示为大写
S
1.2 怎么设置 SUID¶
设置 SUID 的方式有两种:一种是通过字符方式设置,另一种是通过数字方式设置。
字符方式设置 SUID
$ chmod u+s file
数字方式设置 SUID
$ chmod 4755 file
1.3 用户组 ID(SGID)¶
设置用户组 ID(SGID)是一种特殊权限标志,通常用于目录。它可以确保在该目录中创建的文件默认属于该目录的用户组,而不是文件创建者自己的主组,这在协作目录场景中非常常见。
- SGID 在权限位中通常显示为
s或S - 对应的权限数字是
2 - 如果用户组执行位存在,则显示为小写
s - 如果用户组执行位不存在,则显示为大写
S
1.4 怎么设置 SGID¶
设置 SGID 也有两种方式:
字符方式设置 SGID
$ chmod g+s directory
数字方式设置 SGID
$ chmod 2755 directory
1.5 粘滞位(Sticky)¶
粘滞位通常用于目录,尤其是共享目录。设置后,虽然多个用户都可以在目录中创建文件,但每个用户通常只能删除自己的文件。
比如 /tmp 目录就是典型例子,其权限通常类似:
drwxrwxrwt
- Sticky 在权限位中通常显示为
t - 对应的权限数字是
1
1.6 怎么设置粘滞位¶
设置粘滞位同样有字符方式和数字方式两种:
字符方式设置粘滞位
$ chmod o+t /tmp/
数字方式设置粘滞位
$ chmod 1777 /tmp/
二、特殊权限速查表¶
| 特殊权限 | 判断方式 | 含义 | 例子 |
|---|---|---|---|
| 用户 ID(SUID) | 在 u 的位置上出现 s 或 S,对应权限数字 4 |
用户执行该程序时,临时拥有文件所有者的权限 | passwd 命令 |
| 用户组 ID(SGID) | 在 g 的位置上出现 s 或 S,对应权限数字 2 |
在协作目录中创建的文件会继承目录所属用户组 | 共享目录 |
| 粘滞位(Sticky) | 在 o 的位置上出现 t,对应权限数字 1 |
多用户都能在目录中创建内容,但通常只能管理自己的文件 | /tmp/ 目录 |
三、Linux 特殊属性:lsattr 与 chattr¶
lsattr 和 chattr 都用于管理文件或目录的特殊属性,常见于更高要求的安全控制场景。通常需要超级用户权限或具备足够权限后才能操作。
3.1 lsattr 用法¶
lsattr 用于查看文件和目录的特殊属性。
| lsattr 命令选项 | 命令说明 |
|---|---|
lsattr 文件/目录 |
查看文件和目录的特殊属性 |
示例:查看 a.txt 文件的特殊属性。
$ lsattr a.txt
3.2 chattr 用法¶
chattr 用于设置或清除文件、目录的特殊属性。
| chattr 命令选项 | 命令说明 |
|---|---|
chattr +a 文件/目录 |
设置追加位,只允许追加内容,不允许修改或删除 |
chattr -a 文件/目录 |
取消追加位 |
chattr +i 文件/目录 |
设置不可修改位,文件内容不能被修改、删除,甚至超级用户也难以直接更改 |
chattr -i 文件/目录 |
取消不可修改位 |
常见示例如下:
修改 a.txt 文件的特殊属性为只能追加:
$ chattr +a a.txt
取消 a.txt 文件的只能追加属性:
$ chattr -a a.txt
设置 a.txt 文件为不可修改位:
$ chattr +i a.txt
取消 a.txt 文件的不可修改位:
$ chattr -i a.txt
四、小结¶
当你需要超出基础 rwx 权限的更细粒度控制时,可以从下面三个方向考虑:
- 使用 SUID 处理“以文件属主身份执行程序”的场景。
- 使用 SGID 处理“协作目录统一属组”的场景。
- 使用 Sticky 和
chattr处理“共享目录保护”和“重要文件防误删、防误改”的场景。