在 Linux 里,文件权限大家都很熟:r / w / x,再加上属主、属组、其他用户,日常用起来已经够多了。但真正在生产环境里混久了,总会遇到几个“看起来怪怪的权限位”——多出来的s、t,甚至数字前面多了一个 4、2、1。
这就是 Linux 的 三种特殊权限。它们不常用,但一旦用上,往往都很关键。
一、SUID:谁执行,权限就像谁?
先说 SUID(Set User ID)。
正常情况下,一个程序是“谁运行,就用谁的权限”。那如果一个普通用户想执行一个必须用 root 权限才能完成的操作,怎么办?
这时候就轮到 SUID 出场了。
当一个可执行文件设置了 SUID 位后,程序在运行时,会临时拥有文件属主的身份,而不是执行者的身份。最经典的例子就是passwd命令。
你有没有想过:普通用户为什么能改/etc/shadow?明明那个文件只有 root 才能写。
答案很简单:passwd是 root 拥有的,并且设置了 SUID。你运行它时,表面上是你在执行,实际上程序是“以 root 的身份”在干活。
所以 SUID 的核心一句话可以记住:
“执行者不重要,重要的是这个文件是谁的。”
当然,这个权限也很危险。给错了程序,等于给了别人一把“半个 root 的钥匙”。
二、SGID:不只是文件,目录更关键
SGID(Set Group ID) 和 SUID 很像,只不过它管的是“组”。
在可执行文件上,SGID 表示:
程序运行时使用文件所属的组权限。
但它真正常用的地方,其实是 目录。
当一个目录设置了 SGID 后,会发生一件非常实用的事:
在这个目录里新建的文件,默认继承目录的属组,而不是创建者自己的主组。
这在多人协作目录里非常重要。否则会出现什么问题?
A 建的文件,组是 A 的;B 建的文件,组又是 B 的;权限一乱,协作立刻变成灾难。
所以 SGID 更像是在说:
“进了这个目录,就按这里的组规矩来。”
三、Sticky Bit:能创建,不一定能删
最后一个是 Sticky Bit,也就是常见的t。
它几乎只对 目录 有意义,用来解决一个非常现实的问题:
所有人都能写的目录,谁来保证文件不会被乱删?
典型场景就是/tmp目录。
所有用户都能往里面写文件,但如果没有 Sticky Bit,那任何人都可以删除别人的临时文件,这显然不现实。
开启 Sticky Bit 后,规则变成了:
只有文件的所有者、目录的所有者,或者 root,才能删除或重命名这个文件。
所以 Sticky Bit 的本质不是“限制创建”,而是:
“你可以在这放东西,但别动不属于你的。”
总结一下这三种特殊权限
SUID:程序执行时,临时获得文件属主的权限
SGID:
文件:执行时继承文件属组
目录:新文件继承目录的属组
Sticky Bit:目录里,谁创建谁负责,别人不能乱删
如果说普通权限解决的是“你能不能读、写、执行”,
那这三种特殊权限解决的就是更现实的问题:
你到底是“以谁的身份”在做事,又“能对谁的东西动手”。
这也正是它们存在的意义。