我们之前认识的文件的权限仅局限于r,w,x,但如果我们执行命令“ll /tmp; ll /usr/bin/passwd”,会出现除了r,w,x之外的其他字母:

文件特殊权限:SUID,SGID,SBIT_可执行

即出现了特殊权限(s跟t)。

【SetUID】

当s这个标志出现在文件所有者的x权限上时,此时就被称为Set UID,简称为SUID的特殊权限。

我们认识一下SUID的权限对于文件的功能:

  1. SUID权限仅对二进制程序(binary program)有效;
  2. 执行者对于该程序需要具有x的可执行权限;
  3. 本权限仅在执行该程序的过程中(run-time)有效;
  4. 执行者将具有该程序所有者(owner)的权限。

举个例子,我们的Linux系统中,所有账号的密码都记录在/etc/shadow这个文件里面,这个文件的权限为“-r-------- 1 root root”,意思是这个文件仅有root可读且仅有root可以强制写入而已。既然这个文件仅有root可以修改,那为什么liuyu这个一般账号用户却能自行修改自己的密码呢?

明明/etc/shadow的权限就不能让liuyu这个一般账号去访问的,为什么liuyu还能够修改这个文件内的密码呢?

这就是SUID的功能了!!

由上述介绍的功能,我们可以知道:

  1. liuyu对于/usr/bin/passwd这个程序来说是具有x权限的,表示liuyu能执行passwd;
  2. passwd的拥有者是root这个账户;
  3. liuyu执行passwd的过程中,会“暂时”获得root的权限;
  4. /etc/shadow可以被liuyu所执行的passwd所修改。

但如果liuyu使用cat却不能读取/etc/shadow!!这是因为cat不具有SUID的权限,所以liuyu执行“cat /etc/shadow”是不能读取/etc/shadow的。

此外,SUID仅可用在二进制程序上,不能够用在shell script上面。这是因为shell script只是将很多的二进制执行文件调进来执行而已。所以SUID的权限部分,还是得要看shell script调用进来的程序的设置,而不是shell script本身。当然,SUID对于目录也是无效的!!

【Set GID】

当s这个标志出现在用户组的x权限上时,此时就被称为Set UID, SUID。

与SUID不同的是,SGID既可以针对文件,也可以针对目录来设置。

对文件来说,SGID具有如下功能:

SGID对二进制程序有用;

程序执行者对于该程序来说,需具备x的权限;

执行者在执行的过程中将会获得该程序用户组的支持。

当一个目录设置了SGID的权限后,它将具有如下的功能:

用户若对于此目录具有r与x的权限时,该用户能够进入此目录;

用户在此目录下的有效用户组将会变成该目录的用户组;

若用户在此目录下具有w的权限(可以创建文件),则用户所创建的新文件的用户组与此目录的用户组相同。

SGID对于项目开发来说是非常重要的,因为这涉及用户组权限的问题。

【Sticky Bit】

这个SBIT目前只针对目录有效,对于文件已经没有效果了。

SBIT对于目录的作用是:

当用户