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用户
能够删除这些文件。