SertGID针对文件的作用

  1. 只有可执行的二进制程序才能设置SGID(SetGID)权限
  2. 命令执行者要对该程序拥有x(执行)权限
  3. 命令执行者在执行程序的时候,获得该程序文件所属组的组身份
  4. SetGID权限同样只在该程序执行过程中有效

    组身份改变只在程序执行过程中有效

针对文件作用的解释

  1. [root@localhost /]# ll /usr/bin/locate ## 查看locate的命令,注意所属组权限--s
  2. -rwx--s--x. 1 root slocate 40520 4 11 2018 /usr/bin/locate
  3. [root@localhost /]# ll /var/lib/mlocate/mlocate.db ## 查看locate命令对应的数据库文件的权限
  4. -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针对目录的作用

  1. 普通用户必须对该目录拥有读(r)权限和执行(x)权限,才嗯那个进入此目录
  2. 普通用户在此目录中的有效用户组会变成此目录的所属组
  3. 如果普通用户对此目录拥有写(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权限