在Linux系统的文件权限体系中,s权限是区别于常规rwx权限的特殊权限,它主要包含setuid、setgid和粘滞位(sticky bit)三种类型,不同类型的s权限作用场景和生效逻辑存在明显差异。

s权限的三种类型及作用
1. setuid权限
setuid权限出现在文件所有者的执行权限位上,当普通用户执行带有setuid权限的可执行文件时,进程会以该文件所有者的身份运行,而不是执行用户的身份。最常见的例子是/usr/bin/passwd文件,普通用户可以通过这个命令修改自己的密码,而修改密码需要写入/etc/shadow文件,该文件只有root用户有写入权限,因此passwd命令设置了setuid权限,让普通用户执行时临时获得root权限完成密码修改。
查看setuid权限的文件时,所有者执行位会显示为s,例如:
ls -l /usr/bin/passwd # 输出类似:-rwsr-xr-x 1 root root 68208 某月 某日 /usr/bin/passwd # 其中所有者的x位显示为s,说明设置了setuid权限
2. setgid权限
setgid权限可以出现在文件或目录的所属组执行权限位上。当设置在可执行文件上时,执行该文件的进程会以文件所属组的身份运行;当设置在目录上时,在该目录下新建的文件或子目录会自动继承该目录的所属组,而不是创建用户的默认所属组,这个特性常用于多用户协作的共享目录场景。
查看setgid权限的目录时,所属组执行位会显示为s,例如:
ls -ld /tmp/shared_dir # 输出类似:drwxrwsr-x 2 root dev 4096 某月 某日 /tmp/shared_dir # 其中所属组的x位显示为s,说明目录设置了setgid权限
3. 粘滞位(sticky bit)
粘滞位出现在目录的其他用户执行权限位上,设置了粘滞位的目录中,只有文件的所有者、目录的所有者或者root用户才能删除或重命名该目录下的文件,其他用户即使对目录有写权限也无法删除他人的文件。最常见的例子是/tmp目录,所有用户都可以在该目录下创建文件,但只能删除自己的文件。
查看设置了粘滞位的目录时,其他用户执行位会显示为t,例如:
ls -ld /tmp # 输出类似:drwxrwxrwt 10 root root 4096 某月 某日 /tmp # 其中其他用户的x位显示为t,说明目录设置了粘滞位
s权限的设置与查看
我们可以使用chmod命令来设置s权限,对应的数字权限值分别是:setuid为4,setgid为2,粘滞位为1,设置时将这些数值加到常规权限数值前面即可。
以下是一些常见的设置示例:
# 给文件设置setuid权限,假设原权限为755,设置后权限为4755 chmod 4755 test_exec # 给目录设置setgid权限,假设原权限为755,设置后权限为2755 chmod 2755 shared_dir # 给目录设置粘滞位,假设原权限为777,设置后权限为1777 chmod 1777 /tmp/new_tmp # 也可以使用符号法设置,给文件添加setuid权限 chmod u+s test_exec # 给目录添加setgid权限 chmod g+s shared_dir # 给目录添加粘滞位 chmod o+t new_tmp
查看权限时,使用ls -l命令即可,s权限会显示在对应的执行权限位上:如果是小写s,说明对应的执行权限位原本就有x权限;如果是大写S,说明对应的执行权限位原本没有x权限,此时s权限不会生效。
s权限使用的安全注意事项
- setuid权限风险较高,不要随意给普通可执行文件设置setuid权限,尤其是shell脚本,很容易造成权限提升漏洞。
- 定期检查系统中设置了setuid和setgid权限的文件,排查是否存在不必要的特殊权限文件,可以使用以下命令查找:
# 查找系统中所有设置了setuid权限的文件 find / -perm -4000 -type f 2>/dev/null # 查找系统中所有设置了setgid权限的文件 find / -perm -2000 -type f 2>/dev/null
- 粘滞位仅对目录有效,不要尝试在文件上设置粘滞位,不会起到预期作用。
- 如果不需要特殊权限,及时使用
chmod u-s 文件名、chmod g-s 目录名、chmod o-t 目录名命令移除对应的s权限。
Linuxs权限setuidsetgidsticky_bit修改时间:2026-06-26 03:48:29