认识了账号相关的两个文件 /etc/passwd 与 /etc/shadow 之后,你或许还是会觉得奇怪,
那么群组的配置文件在哪里?还有,在 /etc/passwd 的第四栏不是所谓的 GID 吗?那又是啥?
呵呵~此时就需要了解 /etc/group 与 /etc/gshadow 啰~
/etc/group 文件结构
这个文件就是在记录 GID 与组名的对应了~鸟哥测试机的 /etc/group 内容有点像这样:
[root@www ~]# head -n 4 /etc/group
root:x:0:root
bin:x:1:root,bin,daemon
daemon:x:2:root,bin,daemon
sys:x:3:root,bin,adm
这个文件每一行代表一个群组,也是以冒号『:』作为字段的分隔符,共分为四栏,每一字段的意义是:
组名:
就是组名啦!
群组口令:
通常不需要配置,这个配置通常是给『群组管理员』使用的,目前很少有这个机会配置群组管理员啦!
同样的,口令已经移动到 /etc/gshadow 去,因此这个字段只会存在一个『x』而已;
GID:
就是群组的 ID 啊。我们 /etc/passwd 第四个字段使用的 GID 对应的群组名,就是由这里对应出来的!
此群组支持的账号名称:
我们知道一个账号可以加入多个群组,那某个账号想要加入此群组时,将该账号填入这个字段即可。
举例来说,如果我想要让 dmtsai 也加入 root 这个群组,那么在第一行的最后面加上『,dmtsai』,注意不要有空格,
使成为『 root:x:0:root,dmtsai 』就可以啰~
谈完了 /etc/passwd, /etc/shadow, /etc/group 之后,我们可以使用一个简单的图示来了解一下 UID / GID 与口令之间的关系,
图示如下。其实重点是 /etc/passwd 啦,其他相关的数据都是根据这个文件的字段去找寻出来的。
下图中, root 的 UID 是 0 ,而 GID 也是 0 ,去找 /etc/group 可以知道 GID 为 0 时的组名就是 root 哩。
至于口令的寻找中,会找到 /etc/shadow 与 /etc/passwd 内同账号名称的那一行,就是口令相关数据啰。
图 1.3.1 、账号相关文件之间的 UID/GID 与口令相关性示意图
至于在 /etc/group 比较重要的特色在于第四栏啦,因为每个使用者都可以拥有多个支持的群组,这就好比在学校念书的时候,
我们可以加入多个社团一样! ^_^。不过这里你或许会觉得奇怪的,那就是:『假如我同时加入多个群组,那么我在作业的时候,到底是以那个群组为准?』
底下我们就来谈一谈这个『有效群组』的概念。
有效群组(effective group)与初始群组(initial group)
还记得每个使用者在他的 /etc/passwd 里面的第四栏有所谓的 GID 吧?那个 GID 就是所谓的『初始群组
(initial group) 』!也就是说,当用户一登陆系统,立刻就拥有这个群组的相关权限的意思。
举例来说,我们上面提到 dmtsai 这个使用者的 /etc/passwd 与 /etc/group 还有 /etc/gshadow
相关的内容如下:
[root@www ~]# usermod -G users dmtsai <==先配置好次要群组
[root@www ~]# grep dmtsai /etc/passwd /etc/group /etc/gshadow
/etc/passwd:dmtsai:x:503:504::/home/dmtsai:/bin/bash
/etc/group:users:x:100:dmtsai <==次要群组的配置
/etc/group:dmtsai:x:504: <==因为是初始群组,所以第四字段不需要填入账号
/etc/gshadow:users:::dmtsai <==次要群组的配置
/etc/gshadow:dmtsai:!::
仔细看到上面这个表格,在 /etc/passwd 里面,dmtsai 这个使用者所属的群组为 GID=504 ,搜寻一下 /etc/group
得到 504 是那个名为 dmtsai 的群组啦!这就是 initial group。因为是初始群组,
使用者一登陆就会主动取得,不需要在 /etc/group 的第四个字段写入该账号的!
但是非 initial group 的其他群组可就不同了。举上面这个例子来说,我将 dmtsai 加入 users
这个群组当中,由于 users 这个群组并非是 dmtsai 的初始群组,因此,
我必须要在 /etc/group 这个文件中,找到 users 那一行,并且将 dmtsai 这个账号加入第四栏,
这样 dmtsai 才能够加入 users 这个群组啊。
那么在这个例子当中,因为我的 dmtsai 账号同时支持 dmtsai 与 users 这两个群组,
因此,在读取/写入/运行文件时,针对群组部分,只要是 users 与 dmtsai 这两个群组拥有的功能,
我 dmtsai 这个使用者都能够拥有喔!这样瞭呼?不过,这是针对已经存在的文件而言,
如果今天我要创建一个新的文件或者是新的目录,请问一下,新文件的群组是 dmtsai 还是
users ?呵呵!这就得要检查一下当时的有效群组了 (effective group)。
groups: 有效与支持群组的观察
如果我以 dmtsai 这个使用者的身份登陆后,该如何知道我所有支持的群组呢?
很简单啊,直接输入 groups 就可以了!注意喔,是 groups 有加 s 呢!结果像这样:
[dmtsai@www ~]$ groups
dmtsai users
在这个输出的信息中,可知道 dmtsai 这个用户同时属于 dmtsai 及 users 这个两个群组,而且,
第一个输出的群组即为有效群组 (effective group) 了。
也就是说,我的有效群组为 dmtsai 啦~此时,如果我以 touch 去创建一个新档,例如:
『 touch test 』,那么这个文件的拥有者为 dmtsai ,而且群组也是 dmtsai 的啦。
[dmtsai@www ~]$ touch test
[dmtsai@www ~]$ ll
-rw-rw-r-- 1 dmtsai dmtsai 0 Feb 24 17:26 test
这样是否可以了解什么是有效群组了?通常有效群组的作用是在新建文件啦!那么有效群组是否能够变换?
newgrp: 有效群组的切换
那么如何变更有效群组呢?就使用 newgrp 啊!不过使用 newgrp 是有限制的,那就是你想要切换的群组必须是你已经有支持的群组。举例来说, dmtsai 可以在 dmtsai/users
这两个群组间切换有效群组,但是 dmtsai 无法切换有效群组成为 sshd 啦!使用的方式如下:
[dmtsai@www ~]$ newgrp users
[dmtsai@www ~]$ groups
users dmtsai
[dmtsai@www ~]$ touch test2
[dmtsai@www ~]$ ll
-rw-rw-r-- 1 dmtsai dmtsai 0 Feb 24 17:26 test
-rw-r--r-- 1 dmtsai users 0 Feb 24 17:33 test2
此时,dmtsai 的有效群组就成为 users 了。
我们额外的来讨论一下 newgrp 这个命令,这个命令可以变更目前用户的有效群组,
而且是另外以一个 shell 来提供这个功能的喔,所以,以上面的例子来说,
dmtsai 这个使用者目前是以另一个 shell 登陆的,而且新的 shell 给予 dmtsai 有效 GID 为
users 就是了。如果以图示来看就是如下所示:
图 1.3.2 、newgrp 的运行示意图
虽然用户的环境配置(例如环境变量等等其他数据)不会有影响,但是使用者的『群组权限』将会重新被计算。
但是需要注意,由于是新取得一个 shell ,因此如果你想要回到原本的环境中,请输入 exit 回到原本的 shell 喔!
既然如此,也就是说,只要我的用户有支持的群组就是能够切换成为有效群组!好了,
那么如何让一个账号加入不同的群组就是问题的所在啰。你要加入一个群组有两个方式,一个是透过系统管理员 (root) 利用
usermod 帮你加入,如果 root 太忙了而且你的系统有配置群组管理员,那么你可以透过群组管理员以
gpasswd 帮你加入他所管理的群组中!详细的作法留待下一小节再来介绍啰!
/etc/gshadow
刚刚讲了很多关于『有效群组』的概念,另外,也提到 newgrp 这个命令的用法,
但是,如果 /etc/gshadow 这个配置没有搞懂得话,那么 newgrp 是无法动作的呢!
鸟哥测试机的 /etc/gshadow 的内容有点像这样:
[root@www ~]# head -n 4 /etc/gshadow
root:::root
bin:::root,bin,daemon
daemon:::root,bin,daemon
sys:::root,bin,adm
这个文件内同样还是使用冒号『:』来作为字段的分隔字符,而且你会发现,这个文件几乎与 /etc/group
一模一样啊!是这样没错~不过,要注意的大概就是第二个字段吧~第二个字段是口令栏,
如果口令栏上面是『!』时,表示该群组不具有群组管理员!至于第四个字段也就是支持的账号名称啰~
这四个字段的意义为:
组名
口令栏,同样的,开头为 ! 表示无合法口令,所以无群组管理员
群组管理员的账号 (相关信息在 gpasswd 中介绍)
该群组的所属账号 (与 /etc/group 内容相同!)
以系统管理员的角度来说,这个 gshadow 最大的功能就是创建群组管理员啦!
那么什么是群组管理员呢?由于系统上面的账号可能会很多,但是我们 root 可能平时太忙碌,所以当有使用者想要加入某些群组时,
root 或许会没有空管理。此时如果能够创建群组管理员的话,那么该群组管理员就能够将那个账号加入自己管理的群组中!
可以免去 root 的忙碌啦!不过,由于目前有类似 sudo 之类的工具,
所以这个群组管理员的功能已经很少使用了。我们会在后续的 gpasswd 中介绍这个实作。