前面已经学习 SUID、SGID、SBIT 特殊权限,以及各自的含义和功能,那么,如何给文件或目录手动设定这些特殊权限呢?

还是要依赖 chmod 命令。我们知道,使用 chmod 命令给文件或目录设定权限,有 2 种方式,分别是使用数字形式和字母形式,例如:

#数字形式
[root@localhost ~]# chmod 755 ftest
#字母形式
[root@localhost ~]# chmod u=rwx,go=rx ftest

给文件或目录设定 SUID、SGID 和 SBIT 特殊权限,也可以使用这 2 种形式。

有关 chmod 命令的用法,可以阅读《Linux chmod命令》一节。

我们知道,给 chmod 命令传递 3 个数字,即可实现给文件或目录设定普通权限。比如说,"755" 表示所有者拥有 rwx 权限,所属组拥有 rx 权限,其他人拥有 tx 权限。

给文件或目录设定特殊权限,只需在这 3 个数字之前增加一个数字位,用来放置给文件或目录设定的特殊权限,就这么简单。

因此,我们有必要知道 SUID、SGID、SBIT 分别对应的数字,如下所示:

4 --> SUID
2 --> SGID
1 --> SBIT

举个例子,如果要将一个文件权限设置为 -rwsr-xr-x,怎么办呢?此文件的普通权限为 755,另外,此文件还有 SUID 权限,因此只需在 755 的前面,加上 SUID 对应的数字 4 即可。也就是说,只需执行chmod 4755 文件名命令,就完成了-rwsr-xr-x 权限的设定。

关于 -rwsr-xr-x 的普通权限是 755,你可以这样理解,标记有 s 和 t 的权限位,隐藏有 x 权限,对此,本节后续会给出更详细的解释。

同样的道理,如果某文件拥有 SUID 和 SGID 权限,则只需要给 chmod 命令传递 6---(- 表示数字)即可;如果某目录拥有 SGID 和 SBIT,只需要给 chmod 命令传递 3--- 即可。

注意,不同的特殊权限,作用的对象是不同的,SUID 只对可执行文件有效;SGID 对可执行文件和目录都有效;SBIT 只对目录有效。当然,你也可以给文件设置 7---,也就是将 SUID、SGID、SBIT赋予一个文件或目录,例如:

[root@localhost ~]# chmod 7777 ftest
#一次赋予SetUID、SetGID和SBIT权限
[root@localhost ~]# ll ftest
-rwsrwsrwt. 1 root root Apr 19 23:54 ftest

执行过程虽然没有报错,但这样做,没有任何实际意义。

除了赋予 chmod 命令 4 个数字设定特殊权限,还可以使用字母的形式。例如,可以通过 "u+s" 给文件赋予 SUID 权限;通过 "g+s" 给文件或目录赋予 SGID 权限;通过 "o+t" 给目录赋予 SBIT 权限。

举一个例子:

[root@localhost ~]#chmod u+s, g+s, o+t ftest
#设置特殊权限
[root@localhost ~]# ll ftest
-rwsr-sr-t. 1 root root Apr 19 23:54 ftest
[root@localhost ~]# chmod u-s, g-s, o-t ftest
#取消特殊权限
[root@localhost ~]# ll ftest
-rwxr-xr-x. 1 root root Apr 19 23:54 ftest

例子中,通过字母的形式成功给 ftest 文件赋予了 3 种特殊权限,此做法仅为验证字母形式的可行性,对 ftest 文件来说,并无实际意义。

细心的读者可能发现这样一个问题,使用 chmod 命令给文件或目录赋予特殊权限时,原文件或目录中存在的 x 权限会被替换成 s 或 t,而当我们使用 chmod 命令消除文件或目录的特殊权限时,原本消失的 x 权限又会显现出来。

这是因为,无论是 SUID、SGID 还是 SBIT,它们只针对具有 x 权限的文件或目录有效。没有 x 权限的文件或目录,即便赋予特殊权限,也无法发挥它们的功能,没有任何意义。

例如,我们就是要给不具有 x 权限的文件或目录赋予特殊权限,看看有什么效果:

[root@localhost ~]# chmod 7666 ftest
[root@localhost ~]# ll ftest
-rwSrwSrwT. 1 root root Apr 23:54 ftest

可以看到,相应的权限位会被标记为 S(大写)和 T(大写),指的就是设置的 SUID、SGID 和 SBIT 权限没有意义。