一、Linux 12 位权限体系中的特殊权限

除了常见的 9 位基础权限,Linux 还支持 3 位特殊权限,分别是 SUID、SGID 和 Sticky。它们主要用于控制程序执行身份、协作目录权限以及共享目录下文件删除行为。

1.1 用户 ID(SUID)

设置用户 ID(SUID)是一种特殊权限标志,适用于可执行文件。它允许普通用户在运行特定程序时获得程序所有者的权限,而不是自己的权限。

SUID 常用于允许普通用户执行一些需要特权的操作,例如修改密码或执行某些系统相关任务。

  • SUID 在权限位中通常显示为 sS
  • 对应的权限数字是 4
  • 如果文件所有者包含执行权限,则显示为小写 s
  • 如果文件所有者不包含执行权限,则显示为大写 S

1.2 怎么设置 SUID

设置 SUID 的方式有两种:一种是通过字符方式设置,另一种是通过数字方式设置。

字符方式设置 SUID

$ chmod u+s file

数字方式设置 SUID

$ chmod 4755 file

1.3 用户组 ID(SGID)

设置用户组 ID(SGID)是一种特殊权限标志,通常用于目录。它可以确保在该目录中创建的文件默认属于该目录的用户组,而不是文件创建者自己的主组,这在协作目录场景中非常常见。

  • SGID 在权限位中通常显示为 sS
  • 对应的权限数字是 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 的位置上出现 sS,对应权限数字 4 用户执行该程序时,临时拥有文件所有者的权限 passwd 命令
用户组 ID(SGID) g 的位置上出现 sS,对应权限数字 2 在协作目录中创建的文件会继承目录所属用户组 共享目录
粘滞位(Sticky) o 的位置上出现 t,对应权限数字 1 多用户都能在目录中创建内容,但通常只能管理自己的文件 /tmp/ 目录

三、Linux 特殊属性:lsattr 与 chattr

lsattrchattr 都用于管理文件或目录的特殊属性,常见于更高要求的安全控制场景。通常需要超级用户权限或具备足够权限后才能操作。

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 处理“共享目录保护”和“重要文件防误删、防误改”的场景。