Linux的文件权限不只有r,x,w还有s,t。与系统账号和系统进程相关。
s可以出现在文件拥有者的x权限位置上,也可以出现在文件所属组的x权限位上。前者被称为set UID,简称SUID,后者被称为Set GID,简称SGID。
执行命令ls -l /bin/su,能够看到这个命令权限是 -rwsr-xr-x,这就是SUID。SUID权限拥有这样的功能:
- SUID仅对二进制程序有效;
- 执行者对于该程序具有x的可执行权限;
- 执行权限仅在该程序执行过程中有效;
- 执行者将具有改程序拥有者的权限;
su这个命令,无论任何人执行了它都具有root权限,因为它的拥有者是root,只是这个权限仅在su命令中有效。这也是su命令能够切换用户的实现原理。
设置SUID权限可以使用u+s来进行。
SUID在Linux中是非常常见的。那些需要提供给普通用户,但是又需要root权限的程序基本都有SUID,如passwd,mount等。
相对于SUID,SGID比较少见。典型的是/usr/bin/locate,他的权限是-rws--s--x,设置SGID,用g+s来进行。SGID权限的功能是这样的。
- SGID仅对二进制程序有效。
- 执行者对该程序有x的可执行权限。
- 执行者在执信过程中将会获得该程序所属用户组的支持。
SGID用在locate命令上,是期望任何用户在执行命令时候能够
读取mlocate.db文件内容。这个文件位于/var/lib/mlocate/mlocate.db。与locate命令有相同的用户组,而且用户组具有读权限,其他用户没有任何权限。
SGID除了用在二进制程序上,还能够用在目录上,当一个目录设置了SGID后,具有如下功能:
- 用户若对此目录拥有r与x权限时,该用户能够进入次目录。
- 该用户在此目录下的有效用户组将变成该目录的用户组。
- 若用户在此目录下具有w的权限,则用户所创建的新文件的用户组与此目录的用户组相同。
有了这一特性,进入目录的用户就会发生有效用户和实际用户不一致的情况。另外一种导致有效用户和实际用户组不一致到情况是使用newgrp命令。而有效用户组所起到的作用就在于创建文件时文件的用户组。
文件的拥有者和用户者和用户组的x权限位可以有s,其他用户的权限位也有类似的标记,t。设置这个权限使用o+t。t的权限名称是Sticky Bit。简称SBIT。仅对目录有效。SBIT对于目录的作用如下:
- 用户若对此目录拥有w和x权限,即拥有写的权限。
- 当用户在此目录下创建了文件或目录,仅自己和root才有权利删除。
- SBIT典型的应用是/temp目录。允许任何用户创建文件,为了避免文件被其他人误删除,设置SBIT权限。
SUID,SGID,SBIT和普通的x,w,r权限一样能用数字法设置。只需将原来的3位数字扩展到4位即可。SUID代表4,SGID代表2,SBIT代表1.他们放在数字权限的最开头。如设置SUID,写成4755