前面已经学习 SUID、SGID、SBIT 特殊权限,以及各自的含义和功能,那么,如何给文件或目录手动设定这些特殊权限呢?
还是要依赖 chmod 命令。我们知道,使用 chmod 命令给文件或目录设定权限,有 2 种方式,分别是使用数字形式和字母形式。例如:
给文件或目录设定 SUID、SGID 和 SBIT 特殊权限,也可以使用这 2 种形式。
我们知道,给 chmod 命令传递 3 个数字,即可实现给文件或目录设定普通权限。比如说,"755" 表示所有者拥有 rwx 权限,所属组拥有 rx 权限,其他人拥有 tx 权限。
给文件或目录设定特殊权限,只需在这 3 个数字之前增加一个数字位,用来放置给文件或目录设定的特殊权限,就这么简单。
因此,我们有必要知道 SUID、SGID、SBIT 分别对应的数字,如下所示:
举个例子,如果要将一个文件权限设置为 -rwsr-xr-x,怎么办呢?此文件的普通权限为 755,另外,此文件还有 SUID 权限,因此只需在 755 的前面,加上 SUID 对应的数字 4 即可。也就是说,只需执行chmod 4755 文件名命令,就完成了-rwsr-xr-x 权限的设定。
同样的道理,如果某文件拥有 SUID 和 SGID 权限,则只需要给 chmod 命令传递 6---(- 表示数字)即可;如果某目录拥有 SGID 和 SBIT,只需要给 chmod 命令传递 3--- 即可。
注意,不同的特殊权限,作用的对象是不同的,SUID 只对可执行文件有效;SGID 对可执行文件和目录都有效;SBIT 只对目录有效。当然,你也可以给文件设置 7---,也就是将 SUID、SGID、SBIT赋予一个文件或目录,例如:
执行过程虽然没有报错,但这样做,没有任何实际意义。
除了赋予 chmod 命令 4 个数字设定特殊权限,还可以使用字母的形式。例如,可以通过 "u+s" 给文件赋予 SUID 权限;通过 "g+s" 给文件或目录赋予 SGID 权限;通过 "o+t" 给目录赋予 SBIT 权限。
举一个例子:
例子中,通过字母的形式成功给 ftest 文件赋予了 3 种特殊权限,此做法仅为验证字母形式的可行性,对 ftest 文件来说,并无实际意义。
细心的读者可能发现这样一个问题,使用 chmod 命令给文件或目录赋予特殊权限时,原文件或目录中存在的 x 权限会被替换成 s 或 t,而当我们使用 chmod 命令消除文件或目录的特殊权限时,原本消失的 x 权限又会显现出来。
这是因为,无论是 SUID、SGID 还是 SBIT,它们只针对具有 x 权限的文件或目录有效。没有 x 权限的文件或目录,即便赋予特殊权限,也无法发挥它们的功能,没有任何意义。
例如,我们就是要给不具有 x 权限的文件或目录赋予特殊权限,看看有什么效果:
可以看到,相应的权限位会被标记为 S(大写)和 T(大写),指的就是设置的 SUID、SGID 和 SBIT 权限没有意义。