# Linux用户和组管理

## 一、用户与用户组

### 1.1、什么是用户

前面有提到，Linux具有很好的安全性，其安全性有一部分原因是有良好的用户和组管理方法。

Linux是多用户多任务的操作系统，也就是说，多个用户可以同时登陆执行不同任务。用户需要使用系统资源则需向系统管理员申请账户进入系统。不同的用户则拥有不同的权限。

用户又分*超级用户*和*普通用户*，超级用户即系统管理员root。



### 1.2、什么是用户组

Linux除了用户，还有一个用户组的概念。当我们需要让多个用户都拥有某一个权限，就可以把他们放进同一个用户组里，方便集中管理。



其中用户组也分两种，一种是主用户组（primary group），一种是次用户组（secondary group）

主用户组的信息保存在/etc/passwd 文件中，次用户组的信息保存在/etc/group 中。

当用户被创建之后默认属于同名用户组，即主用户组，后来再将该用户加入其他用户组的话，加入的用户组为该用户的次用户组。

```shell
~ ➤ grep datawhale /etc/group                                                  
datawhale:x:1001:datawhale1
# datawhale1即为次用户组
```



### 1.3、用户与用户组的关系

每个用户在创建时都会自动属于一个用户组，此外用户与用户组之间的关系又可以分为以下四种：

1. 一对一：一个用户可以存在一个组中，是组中的唯一成员；
2. 一对多：一个用户可以存在多个用户组中，此用户具有这多个组的共同权限；
3. 多对一：多个用户可以存在一个组中，这些用户具有和组相同的权限；
4. 多对多：多个用户可以存在多个组中，也就是以上 3 种关系的扩展。

*******

## 二、用户ID与组ID

在Linux系统中，并不是通过用户名来识别用户的，用户名只是方便用户记忆，在系统里，是通过用户ID来判断是哪个用户的。用户 datawhale 会被赋予一个名为Datawhale 的用户组，且成为该新建用户组的唯一成员，同时UID和GID会被分别写入`/etc/passwd`和`/etc/group`中。

```shell
~ ➤ sudo useradd datawhale                                                     
~ ➤ grep datawhale /etc/passwd                                                 
datawhale:x:1001:1001::/home/datawhale:/bin/sh

#用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录shell

~ ➤ grep datawhale /etc/group                                                  
datawhale:x:1001:   
```

**主目录**：用户的起始工作目录，用户登录后有操作权限的访问目录

**注释性描述**：这个字段并没有什么实际的用途。在不同的Linux 系统中，这个字段的格式并没有统一。在许多Linux系统中，这个字段存放的是一段任意的注释性描述文字，用做finger命令的输出。

**登陆shell**：用户登录后，要启动一个进程，负责将用户的操作传给内核，这个进程是用户登录到系统后运行的命令解释器或某个特定的程序，即Shell。



通常情况下，UID是递增的，上一个是1000，下一个则是1001。

```shell
~ ➤ sudo useradd datawhale1                                                    
~ ➤ grep datawhale1 /etc/passwd                                                
datawhale1:x:1002:1002::/home/datawhale1:/bin/sh
```

系统管理员的UID为0

```shell
~ ➤ grep root /etc/passwd                                                      
root:x:0:0:root:/root:/bin/bash
```



## 三、用户与用户组管理命令

Linux用户和组管理命令主要有如下几类：

### 3.1 用户的增删修改

**添加用户**：

```shell
useradd 选项 用户名
```



| 选项 | 作用                                                         |
| ---- | ------------------------------------------------------------ |
| -u   | 手工指定用户的 UID，注意 UID 的范围（不要小于 500）。        |
| -d   | 手工指定用户的主目录。主目录必须写绝对路径，而且如果需要手工指定主目录，则一定要注意权限； |
| -c   | 手工指定/etc/passwd文件中各用户信息中第 5 个字段的描述性内容，可随意配置； |
| -g   | 手工指定用户的初始组。一般以和用户名相同的组作为用户的初始组，在创建用户时会默认建立初始组。一旦手动指定，则系统将不会在创建此默认的初始组目录。 |
| -G   | 指定用户的附加组。我们把用户加入其他组，一般都使用附加组；   |
| -s   | 手工指定用户的登录 Shell，默认是 /bin/bash；                 |
| -e   | 指定用户的失效日期                                           |
| -o   | 允许创建的用户的 UID 相同。例如，执行 "useradd -u 0 -o usertest" 命令建立用户 usertest，它的 UID 和 root 用户的 UID 相同，都是 0； |
| -m   | 创建用户时强制建立用户的家目录。在建立系统用户时，该选项是默认的； |
| -r   | 创建系统用户                                                 |



**删除用户**

```
userdel 选项 用户名
```

-r 选项表示在删除用户的同时删除用户的家目录。



**修改用户**

```
usermod 选项 用户名
```

| 选项        | 说明                                                         |
| ----------- | ------------------------------------------------------------ |
| -c 用户说明 | 修改用户的说明信息，即修改 /etc/passwd 文件目标用户信息的第 5 个字段； |
| -d 主目录   | 修改用户的主目录，即修改 /etc/passwd 文件中目标用户信息的第 6 个字段，需要注意的是，主目录必须写绝对路径； |
| -e 日期     | 修改用户的失效曰期，格式为 "YYYY-MM-DD"，即修改 /etc/shadow 文件目标用户密码信息的第 8 个字段； |
| -g 组名     | 修改用户的初始组，即修改 /etc/passwd 文件目标用户信息的第 4 个字段（GID）； |
| -u UID      | 修改用户的UID，即修改 /etc/passwd 文件目标用户信息的第 3 个字段（UID）； |
| -G 组名     | 修改用户的附加组，其实就是把用户加入其他用户组，即修改 /etc/group 文件； |
| -l 用户名   | 修改用户名称；                                               |
| -L          | 临时锁定用户（Lock）；                                       |
| -U          | 解锁用户（Unlock），和 -L 对应；                             |
| -s shell    | 修改用户的登录 Shell，默认是 /bin/bash。                     |



**修改用户密码**

```
passwd 选项 用户名
```

| 选项    | 作用                                                         |
| ------- | :----------------------------------------------------------- |
| -l      | 暂时锁定用户，该选项会在 /etc/shadow 文件中指定用户的加密密码串前添加 "!"，使密码失效。仅 root 用户可用； |
| -u      | 解锁用户，和 -l 选项相对应，也是只能 root 用户使用；         |
| -d      | 使账号无口令，删除密码                                       |
| -f      | 强迫用户下次登录时修改口令                                   |
| -S      | 查询用户密码的状态，显示密码信息，也就是 /etc/shadow 文件中此用户密码的内容。仅 root 用户可用； |
| -g      | 修改群组密码                                                 |
| -n 天数 | 设置该用户修改密码后，多长时间不能再次修改密码，也就是修改 /etc/shadow 文件中各行密码的第 4 个字段； |
| -x 天数 | 设置该用户的密码有效期，对应 /etc/shadow 文件中各行密码的第 5 个字段； |
| -w 天数 | 设置用户密码过期前的警告天数，对于 /etc/shadow 文件中各行密码的第 6 个字段； |
| -i 日期 | 设置用户密码失效日期，口令过期后多少天停用账户，对应 /etc/shadow 文件中各行密码的第 7 个字段 |



### 3.2 用户组管理

**添加用户组**

```shell
groupadd 选项 用户组
```

| 选项   | 描述           |
| ------ | -------------- |
| -g GID | 指定组 ID；    |
| -r     | 创建系统群组。 |



**删除用户组**

```
groupdel 组名
```

需要从系统上删除群组时，可用groupdel(group delete)指令来完成这项工作。

**注意，不能使用 groupdel 命令随意删除群组**。此命令仅适用于删除那些 "不是任何用户初始组" 的群组，换句话说，如果有群组还是某用户的初始群组，则无法使用 groupdel 命令成功删除。倘若该群组中仍包括某些用户，则必须先删除这些用户后，方能删除群组。



**修改用户组属性**

```
groupmod 选项 用户组
```

| 选项      | 描述               |
| --------- | ------------------ |
| -g GID    | 修改组 ID          |
| -n 新组名 | 修改组名           |
| -o        | 重复使用群组识别码 |



**切换用户组**

```
newgrp 目标用户组
```

newgrp 指令类似 login 指令，当它是以相同的帐号，另一个群组名称，再次登入系统。**newgrp 命令可以从用户的附加组中选择一个群组，作为用户新的初始组。**欲使用 newgrp 指令切换群组，您必须是该群组的用户，否则将无法登入指定的群组。单一用户要同时隶属多个群组，需利用交替用户的设置。若不指定群组名称，则 newgrp 指令会登入该用户名称的预设群组。





****

## 参考资料

[1] https://www.linuxprobe.com/linux-group.html

[2] https://www.linuxprobe.com/common-user-group.html

[3] https://www.runoob.com/linux/linux-user-manage.html

[4] https://www.cnblogs.com/ddz-linux/p/10467106.html

[5] http://c.biancheng.net/linux_tutorial/60/

[6] http://c.biancheng.net/view/848.html

[7] https://www.runoob.com/linux/linux-command-manual.html