主要组与普通组的区别
什么是主要组
用户的主要组和普通组与用户的组权限有关,可能平时在使用中没注意过,但它确确实实的存在。为了理解什么是主要组与普通组我们通过创建一个用户来快速理解下:
首先使用超级管理员用户或具有超级管理员权限的用户创建一个用户,我这里直接使用 root 用户,创建的用户名叫 webuser:
useradd -m -s /usr/bin/bash webuser
同时呢给这个新用户设置个简单的密码,不然这个新用户处于锁定状态无法用于系统登录:
echo "webuser:123456" | chpasswd
重点来了,看下用户和组信息:
$ grep webuser /etc/passwd /etc/group
...
/etc/passwd:webuser:x:1003:1003::/home/webuser:/usr/bin/bash
/etc/group:webuser:x:1003:
我们知道,当我们创建用户时,如果不使用参数 -g 明确指定一个组时,操作系统会默认创建一个同名的组,而这个组就是该用户的主要组。
注意看上面的用户数据和组数据,在用户中记录了组的ID:1003。但是在组的数据中我们可以看到该组没有具体的用户。那问题来了,在组 webuser 数据中没有任何成员,那用户 webuser 为什么还会是组 webuser 的成员呢?这就是用户数据中 GID 的功能,使用这个 GID 指定的组就是该用户的主要组。
现在使用 webuser 用户登录到系统:
ssh webuser@host
或者直接使用 su 命令切换:
su - webuser
登录或切换成功后使用 id 命令查看下当前用户信息(或使用 groups 命令):
$ id
uid=1003(webuser) gid=1003(webuser) groups=1003(webuser)
其中,gid 指定得组就是该用户的主要组,而后面的 groups 指定的就是该用户的所有组。有什么用呢?来创建一个文件:
touch readme
看下该文件的所属组信息:
$ ls -l
total 0
-rw-r--r-- 1 webuser webuser 0 Dec 8 14:53 readme
[-----]
|
+-------> 文件所属组是 webuser
因为该用户只有一个用户组,所以很不直观,再来创建一个组 developers:
使用 root 用户创建组:
groupadd developers
或者在当前用户环境直接借助 su 命令创建组:
su - -c "groupadd developers"
因为组 developers 是刚刚创建的,所以还没有用户:
groupmems -g developers -l
现在就将 webuser 添加到组 developers 中:
groupmems -g developers -a webuser
再查看组 developers 成员:
$ groupmems -g developers -l
webuser
重新登录到 webuser,使用 id 命令查看用户信息:
$ id
uid=1003(webuser) gid=1003(webuser) groups=1003(webuser),1004(developers)
可以看到,在 groups 信息中多了一个组 developers,但是 gid 信息没变。
再创建一个文件 readme1:
touch readme1
查看文件所属组信息:
$ ls -l
total 0
-rw-r--r-- 1 webuser webuser 0 Dec 8 14:53 readme
-rw-r--r-- 1 webuser webuser 0 Dec 8 15:22 readme1
现在你奇怪不?明明将用户 webuser 添加到组 developers 中了,为什么创建的 readme1 文件的所属组还是 webuser 而不是 developers 呢?这就是主要组的功能了!
另外,在工作中如果没有权限直接查看 /etc/passwd 文件信息,可以直接利用 id 或 groups 命令来确认主要组:
使用 id 命令查看:
$ id
uid=1003(webuser) gid=1003(webuser) groups=1003(webuser),1004(developers)
gid 指定的组就是该用户的主要组。
使用 groups 命令查看:
$ groups
webuser developers
groups 命令输出的组中,第一个组就是该用户的主要组。
修改主要组
修改用户的主要组使用下面的命令即可(需要超级管理员权限):
usermod -g [主要组] [用户]
[主要组] 可以是具体的 GID 也可以使用组的名称,后面的 [用户] 就是需要指定修改的用户了。
先来看下用户 webuser 的信息:
$ grep webuser /etc/passwd /etc/group
...
/etc/passwd:webuser:x:1003:1003::/home/webuser:/usr/bin/bash
/etc/group:webuser:x:1003:
/etc/group:developers:x:1004:webuser
我们将组 developers 设置为用户 webuser 的主要组:
usermod -g 1004 webuser
再来看下用户 webuser 的数据信息:
$ grep webuser /etc/passwd /etc/group
...
/etc/passwd:webuser:x:1003:1004::/home/webuser:/usr/bin/bash
/etc/group:webuser:x:1003:
/etc/group:developers:x:1004:webuser
现在用户数据的 GID 已经变为 1004 了,但是你会发现用户 webuser 同时也不在组 webuser 中了(为什么?好好想一下)。
所以需要将用户添加到原组 webuser:
# 先查看组 webuser 成员
$ sudo groupmems -g webuser -l
# 将用户 webuser 添加到组 webuser 中
$ sudo groupmems -g webuser -a webuser
# 在看下组 webuser 成员
$ sudo groupmems -g webuser -l
webuser
重新使用用户 webuser 登录系统,查看下现在的用户组信息:
$ id
uid=1003(webuser) gid=1004(developers) groups=1004(developers),1003(webuser)
嗯,此时的 gid 确实变成了 1004。但是问题来了,属于原来主要组 webuser 的文件全部被转移到现在的主要组 developers 来了。如下:
$ ls -l
total 0
-rw-r--r-- 1 webuser developers 0 Dec 8 14:53 readme
-rw-r--r-- 1 webuser developers 0 Dec 8 15:22 readme1
[--------]
|
+------> 主要组权限变更
那现在假设啊,用户还有第三个组 example,该组是一个普通组,并且文件 readme1 的组权限属于该普通组。当我修改主要组时该文件的组权限会被变更吗?感兴趣的可以自行测试下~
临时修改主要组
上面使用 usermod 命令修改用户的主要组是永久性修改的,而且该命令需要具有超级管理员权限的用户才能执行。那如果当前用户想要修改自己的主要组该怎么办?
这就需要借助命令 newgrp 了。该命令是会话级别的,用于临时修改当前用户的主要组。需要特别注意的是,指定的新主要组必须是当前用户的某个组。
刚才我们将 webuser 的主要组设置成 developers 了,我现在就可以直接使用 newgrp 命令将主要组临时修改为 wbuser:
$ newgrp webuser
$ id
uid=1003(webuser) gid=1003(webuser) groups=1003(webuser),1004(developers)
需要特别注意的是,newgrp 是会话级别修改主要组信息。在当前会话中使用 id 命令查看自己的主要组信息确实是修改的,但是如果你查看 /etc/passwd 文件中的用户 GID 信息你会发现还是原来的没有变化。而且,当你退出重新登录之后,刚刚使用 newgrp 设置的主要组也会失效,这就是 newgrp 命令的妙用!
是不是很方便?来创建一个文件 readme2 试下:
$ touch readme2
$ ls -l
total 0
-rw-r--r-- 1 webuser developers 0 Dec 8 14:53 readme
-rw-r--r-- 1 webuser developers 0 Dec 8 15:22 readme1
-rw-r--r-- 1 webuser webuser 0 Dec 8 15:37 readme2
想一下在实际工作中什么时候才会用到这个功能呢?现在假设一种场景,用户A 和 用户B 都是组E 的成员,同时呢,用户A 和用户B 都有自己的主要组。现在用户A 需要创建了一个文件,并且文件的权限值是:rwxrwxr--。也就是说文件的所属组也有读写和执行权限,现在问题来了,我想要让用户B 也能够编辑该文件怎么办?
答案当然是用户A 使用 newgrp 命令临时将自己的主要组设置为 E 了,之后再创建这个文件。由于用户B 也在组 E 中那用户B 自然也有读写和执行权限了。而且,即使用户A 退出后这个文件的所属组也依然是 E,而不会是用户A 的主要组。怎么样,有没有体会到临时主要组的魅力?
--
完结,撒花🎉🎉🎉~