1. 引言
在上一篇文章 Linux学习记录:chmod 修改权限 中,我们已经介绍了 Linux 中是如何控制文件以及目录的权限的。
这篇文章中我们再来介绍几种特殊的权限,即 SUID 、SGID 和 SBIT。
2. 相关背景
从前面的介绍我们已经知道,使用 ll 命令来查看文件或者目录权限时,第一列一共有 10 个字符长度,我们从右往左编号,即 9876543210,其中:
9共 1 位表示标识位:标识当前的文件类型。如d表示目录,-表示普通文件;876共 3 位表示属主的权限;543共 3 位表示组用户的权限;210共 3 位表示其他用户的权限。
如果一个文件 test.txt 的权限为 -rwxrwxrwx,用二进制表示为 111-111-111,用八进制表示则为 777,所以我们经常会看到这种:
1 | chmod 777 test.txt |
意思就是 属主 、组用户、其他用户 都能 read/write/execute 该文件。
其实 Linux 还有 3 个比特位来表示 SUID 、SGID 和 SBIT 等特殊权限。
3. 具体介绍
Linux 表示文件或者目录的权限,总共用了 12 个比特位。其中最低的 9 位,即前面相关背景部分介绍的,用来表示 3 类不同用户的 read/write/execute 权限的。最高的 3 位,从高往低数,分别表示 SUID 权限、SGID 权限和 SBIT 权限。
举个例子:
1 | 11 10 9 8 7 6 5 4 3 2 1 0 |
第一行表示二进制串的位置编号,从 0 开始。第二行表示是否具有对应位的权限,0 代表不具有,1 代表具有。
上述例子的意思是:该文件 属主 能够 read/write/execute,组用户 和 其他用户 只能够 read。同时该文件还具有 SUID 权限。
下面就来具体解释下什么是 SUID 、SGID 和 SBIT 权限。
3.1 SUID 权限
SUID 表示 Set User IDentification 。只能用来控制:是否让某种文件具有 SUID 权限,不能用来控制目录。
当一个文件 example 被设置了 SUID 权限时,那么除了 属主 之外的所有用户,在执行 example 时,都将获得 属主 的权限。
举个例子。example 一开始的权限是:
1 | -rwxr-xr-x |
我们给 example 设置 SUID 权限后,变成:
1 | -rwsr-xr-x |
注意 属主 权限的 execute 位现在是 s 而不是 x,这是因为设置了 SUID 的原因。
此时,组用户 和 其他用户 在执行 example 程序时,就会获得 write 权限。而在设置 SUID 之前,这两类用户是不具备 write 权限的。
那么我们该怎么来设置这个 SUID 权限呢?还记得我们前面介绍的 12 位二进制位吗?我们只需要将最高位设置为 1,用八进制表示即 4755 。
原来我们是这么设置 example 的权限的:
1 | chmod 755 example |
现在我们这么设置:
1 | chmod 4755 example |
3.2 SGID 权限
SGID 的道理和 SUID 相似,只不过 SGID 不仅可以用来控制文件权限,还能控制目录的权限。
还是使用之前的例子。我们的 example 文件一开始的权限是:
1 | -rwxr-xr-x |
当我们给 example 设置 SGID 权限后,变成:
1 | -rwxr-sr-x |
注意 组用户 权限的 execute 位现在是 s 而不是 x,这是因为设置了 SGID 的原因。
此时,组用户(不包括 其他用户) 在执行 example 程序时,就会获得 write 权限。而在设置 SGID 之前,组用户 是不具备 write 权限的。
设置 SGID 权限也很简单,只需要将次高位的二进制设置为 1 即可。所以此时 example 文件的权限值用八进制表示为 2755 。
所以可以这么设置:
1 | chmod 2755 example |
那如果我们想要同时设置 SUID 和 SGID 权限该怎么办呢?想必你也很清楚了,只需要这么做:
1 | chmod 6755 example |
3.2 SBIT 权限
SBIT 只能用来控制目录的权限,不能用来控制文件。
如果一个目录被设置了 SBIT 权限,表示任何一个在此目录下可以新建文件的用户,该文件只有该用户自身、或者是 root用户 可以删除,除此之外的用户都无权删除。
举个例子,我们看 /tmp 目录的权限:
1 | ls -ld /tmp |
结果:
1 | tan@DESKTOP-OPQIR8V:/mnt/c/Users/tanjuntao$ ll -ld /tmp |
注意 其它用户 权限的 execute 位现在是 t 而不是 x,这是因为设置了 SBIT 的原因。
即所有用户都能在 /tmp 目录下新建文件或目录,但只有该用户自身或者 root用户 能够删除这些文件。