SertGID针对文件的作用
- 只有可执行的二进制程序才能设置SGID(SetGID)权限
- 命令执行者要对该程序拥有x(执行)权限
- 命令执行者在执行程序的时候,获得该程序文件所属组的组身份
- SetGID权限同样只在该程序执行过程中有效
组身份改变只在程序执行过程中有效
针对文件作用的解释
[root@localhost /]# ll /usr/bin/locate ## 查看locate的命令,注意所属组权限--s
-rwx--s--x. 1 root slocate 40520 4月 11 2018 /usr/bin/locate
[root@localhost /]# ll /var/lib/mlocate/mlocate.db ## 查看locate命令对应的数据库文件的权限
-rw-r-----. 1 root slocate 3021179 5月 24 03:20 /var/lib/mlocate/mlocate.db
从之前的章节中我们知道,locate命令查找文件实际上是通过遍历其自身维护的数据库文件(mlocate.db)来实现的。那么当一个普通用户执行locate命令的时候,就应当具有对locate命令文件的执行权限和mlocate.db文件的读权限。
但从上述命令的执行结果中可以得出,普通用户具有对locate命令文件的执行权限,却没有对mlocate.db文件的读权限。之所以不会报错提示权限不够,就是因为locate命令文件设置SetGID权限。
也就是说,当普通用户执行locate命令的时候,由于其设置了SetGID权限,那么该用户就临时获得了该命令的所属组身份,即slocate用户组,而mlocate.db文件所属组正是slocate且对所属组可读,因此,普通用户便能使用locate命令。
SetGID针对目录的作用
- 普通用户必须对该目录拥有读(r)权限和执行(x)权限,才嗯那个进入此目录
- 普通用户在此目录中的有效用户组会变成此目录的所属组
- 如果普通用户对此目录拥有写(w)权限,新建文件的默认所属组就是这个目录的所属组
针对目录作用的解释
[root@localhost tmp]# mkdir gmd ## 创建gmd目录
[root@localhost tmp]# chmod 2777 gmd ## 设置gmd目录的权限为SGID和普通文件权限777
[root@localhost tmp]# ll -d gmd ## 查看gmd目录的权限,注意所属组权限rws
drwxrwsrwx. 2 root root 6 5月 24 06:49 gmd
[root@localhost tmp]# su -l dhj ## 切换到dhj用户
[gmd@localhost ~]$ cd /tmp/gmd ## 进入/tmp/gmd目录
[gmd@localhost gmd]$ touch libai.txt ## 创建libai.txt文件
[gmd@localhost gmd]$ mkdir song ## 创建song目录
[gmd@localhost gmd]$ ll ## 查看创建的文件和目录的权限
-rw-rw-r--. 1 dhj root 0 5月 24 06:50 libai.txt ## 注意默认所属组root
drwxrwsr-x. 2 dhj root 6 5月 24 06:50 song ## 注意默认所属组root和所属组权限rws
设定SetGID权限
语法:chmod [参数] [可执行文件名]
参数一:权限数值,2XXX。例如:2777,开头的2即代表SGID权限,777即普通文件权限。
参数二:直接指定,g+s。
## 范例
chmod 2777 pwdOne ## 给pwdOne文件设置SGID权限和普通文件权限777
chmod g+s gmd ## 给gmd目录设置SGID权限
## 和SetUID相同,当该文件权限设置不符合SGID的设置要求,会报错并通过S进行提示
取消SetGID权限
语法:chmod [参数] [可执行文件名]
参数一:普通文件权限数值,XXX,不带SUID权限数值。
参数二:直接指定,g-s。
## 范例
chmod 777 pwdOne ## 取消pwdThree文件的SGID权限,并设置普通文件权限777
chmod g-s gmd ## 取消gmd目录的SGID权限