S 与 T 权限
上图中, S_IRWXU S_IRWXG S_IRWXO 代表常见的三段权限: 拥有者, 同组用户, 其他用户的权限, 而S_ISUID S_ISGID S_ISVTX 代表的是S权限 与 T权限.
S权限
S权限包括 S_ISUID 和 S_ISGID 两个常量在内, 叫做强制位权限.
其中, S_ISUID 只能应用于二进制可执行文件.
S_ISGID 可应用于二进制可执行文件和目录.
注意shell脚本只是有执行权限的文本文件, 而非二进制可执行文件.
当 S_ISUID S_ISGID 用在二进制文件时
- 如果 S_ISUID 为真,则把此进程的有效用户ID设置为此文件拥有者的用户ID.
- 如果 S_ISGID 为真,则把此进程的有效用户组ID设置为此文件的组ID.
由于进程有用户/组ID影响文件访问权限, 于是就相当于临时拥有文件所有者的身份. 典型的文件是passwd. 如果一般用户执行该文件, 则在执行过程中, 该文件可以获得 root 权限, 从而可以更改用户的密码.
当 S_ISGID 用在目录时:
- 当前用户切换至该目录后,用户进程的有效用户组ID(effective group)将会设置为该目录的用户组. 若用户在此目录下具备w权限,则用户进程所创建的新文件的用户组ID与该目录用户组ID相同.
这两个常量的值是:
项 | 十六进制 | 十进制 |
---|---|---|
S_ISUID | 4000 | 2048 |
S_ISGID | 2000 | 1024 |
- 设置S_ISUID 将相应的权限位之前的那一位设置为4, 如: chmod 4755 examplefile
- 设置 S_ISGID 将相应的权限位之前的那一位设置为2, 如: chmod 2755 examplefile
- 两者都设置, 如法炮制, 改成6即可.