/etc/group 文件结构
这个文件每一行代表一个群组,也是以冒号“:”作为字段的分隔符号,共分为四栏,每一字段的意义是:
1. 群组名称: 就是群组名称。同样用来给人类使用的,基本上需要与第三字段的 GID 对应。
2. 群组密码: 通常不需要设置,这个设置通常是给“群组管理员”使用的,目前很少有这个机会设置群组管理员。 同样的,密码已经移动到 /etc/gshadow 去,因此这个字段只会存在一个“x”而已;
3. GID: 就是群组的 ID 。我们 /etc/passwd 第四个字段使用的 GID 对应的群组名,就是由这里对应出来的。
4. 此群组支持的帐号名称: 我们知道一个帐号可以加入多个群组,那某个帐号想要加入此群组时,将该帐号填入这个字段即可。 举例来说,如果我想要让 dmtsai 与 alex 也加入root 这个群组,那么在第一行的最后面加上“dmtsai,alex”,注意不要有空格, 使成为“root:x:0:dmtsai,alex ”就可以。
下图中, root 的 UID 是 0 ,而 GID 也是 0 ,去找/etc/group 可以知道 GID 为 0 时的群组名称就是 root 。 至于密码的寻找中,会找到/etc/shadow 与 /etc/passwd 内同帐号名称的那一行,就是密码相关数据。
图13.1.1、帐号相关文件之间的 UID/GID 与密码相关性示意图
有效群组(effective group)与初始群组(initial group)
GID就是所谓的“初始群组”。当使用者一登陆系统时,立刻就拥有这个群组的相关权限。举例说,上面提到的dmtsai这个使用者的/etc/passwd与/etc/group还有/etc/gshadow相关的内容如下:
在 /etc/passwd 里面,dmtsai 这个使用者所属的群组为 GID=1000,搜寻一下 /etc/group 得到 1000 是那个名为 dmtsai 的群组。这就是 initial group。因为是初始群组, 使用者一登陆就会主动取得,不需要在 /etc/group 的第四个字段写入该帐号的!
但是非 initial group 的其他群组可就不同了。举上面这个例子来说,我将 dmtsai 加入 users这个群组当中,由于 users 这个群组并非是 dmtsai 的初始群组,因此, 我必须要在/etc/group 这个文件中,找到 users 那一行,并且将 dmtsai 这个帐号加入第四栏, 这样dmtsai 才能够加入 users 这个群组。
那么在这个例子当中,因为我的 dmtsai 帐号同时支持 dmtsai, wheel 与 users 这三个群组,因此,在读取/写入/可执行文件案时,针对群组部分,只要是 users, wheel 与 dmtsai 这三个群组拥有的功能, 我 dmtsai 这个使用者都能够拥有。
groups: 有效与支持群组的观察
如果我以 dmtsai 这个使用者的身份登陆后,该如何知道我所有支持的群组呢? 直接输入groups就可以。
在这个输出的讯息中,可知道 dmtsai 这个用户同时属于 dmtsai, wheel 及 users 这三个群组,而且, 第一个输出的群组即为有效群组 (effective group) 了。 也就是说,我的有效群组为 dmtsai 。此时,如果我以 touch 去创建一个新文件,例如: “ touch test ”,那么这个文件的拥有者为 dmtsai ,而且群组也是 dmtsai。
newgrp: 有效群组的切换
那么如何变更有效群组呢?就使用 newgrp 。不过使用 newgrp 是有限制的,那就是你想要切换的群组必须是你已经有支持的群组。举例来说, dmtsai 可以在 dmtsai/wheel/users 这三个群组间切换有效群组,但是 dmtsai 无法切换有效群组成为 sshd 。使用的方式如下:
此时,dmtsai 的有效群组就成为 users 了。我们额外的来讨论一下 newgrp 这个指令,这个指令可以变更目前使用者的有效群组, 而且是另外以一个 shell 来提供这个功能的,所以,以上面的例子来说, dmtsai 这个使用者目前是以另一个 shell 登陆的,而且新的 shell 给予dmtsai 有效 GID 为 users 就是了。如果以图示来看就是如下所示:
图13.1.2、newgrp 的运行示意图
虽然使用者的环境设置(例如环境变量等等其他数据)不会有影响,但是使用者的“群组权限”将会重新被计算。 但是需要注意,由于是新取得一个 shell ,因此如果你想要回到原本的环境中,请输入 exit 回到原本的 shell 。
/etc/gshadow
刚刚讲了很多关于“有效群组”的概念,另外,也提到 newgrp 这个指令的用法,但是,如果/etc/gshadow 这个设置没有搞懂得话,那么 newgrp 是无法动作的。
这个文件内同样还是使用冒号“:”来作为字段的分隔字符,而且你会发现,这个文件几乎与/etc/group 一模一样。 如果密码栏上面是“!”或空的时,表示该群组不具有群组管理员。至于第四个字段也就是支持的帐号名称。这四个字段的意义为:
1. 群组名称
2. 密码栏,同样的,开头为 ! 表示无合法密码,所以无群组管理员
3. 群组管理员的帐号 (相关信息在 gpasswd 中介绍)
4. 有加入该群组支持的所属帐号 (与 /etc/group 内容相同!)
以系统管理员的角度来说,这个 gshadow 最大的功能就是创建群组管理员。那么什么是群组管理员呢?由于系统上面的帐号可能会很多,但是我们 root 可能平时太忙碌,所以当有使用者想要加入某些群组时, root 或许会没有空管理。此时如果能够创建群组管理员的话,那么该群组管理员就能够将那个帐号加入自己管理的群组中。可以免去 root 的忙碌。