Linux中可以使用ls -l
命令查看一个文件的全部权限。
权限一般分为三类,即rwx,分别表示着读权限、写权限、执行权限。
但对于某些文件,却存在一种特殊的权限——s。
s权限示例
例如/usr/bin/passwd
:
该文件是passwd命令的二进制文件。
我们知道,使用passwd 用户名
可以给某个用户重新设置密码,而密码最终会保存到/etc/shadow
文件中。
对于/etc/shadow
,我们查看其权限:
明显,只有root用户具有w——写权限。普通用户如果想写这个文件是不被允许的。然而在实际情况中,普通用户也可以通过passwd命令来修改自己的代码。
其主要原因就在于这个s权限。
s权限说明
s权限出现在x权限的位置,但依据用户、所属组、其他人,又可分为三处,即--s--s--t
,分别称为SUID、SGID、SBIT。
我们先讨论第一处出现s的作用(即SUID)。
这一位置起初代表着用户的可执行权限,在如上/usr/bin/passwd
的权限截图中,代表root的可执行权限。
而从图上可以看出,普通用户对于/usr/bin/passwd
也具有可执行权限。
那么,普通用户执行该文件时,由于s权限的作用,就会暂时处于s权限所属者的位置(即root用户的位置),所以也就对/etc/shadow
文件具有了写权限。
说明:我们这里仅讨论了s权限作用于二进制文件并且是SUID时的作用。但实际上,s权限还可以用于目录,而且也可以作为SGID、SBIT出现。作用效果类似,但稍有不同,这里先不讨论。