# Linux 用户和组管理

#### 博客作者：联系请[点击](https://hezhiqiang.gitbook.io/about-the-author/lian-xi-zuo-zhe)，搬运不易，希望请作者喝咖啡，可以点击[联系博客作者](https://hezhiqiang.gitbook.io/about-the-author/lian-xi-zuo-zhe)

Linux系统是一个多用户多任务的分时操作系统，任何一个要使用系统资源的用户，都必须首先向系统管理员申请一个账号，然后以这个账号的身份进入系统。

&#x20;        用户的账号一方面可以帮助系统管理员对使用系统的用户进行跟踪，并控制他们对系统资源的访问；另一方面也可以帮助用户组织文件，并为用户提供安全性保护，每个用户账号都拥有一个唯一的用户名和各自的登陆密码，用户在登录时键入正确的用户名和密码后，就能够进入系统和自己的主目录。

实现用户账号的管理，要完成的工作主要有如下几个方面：

* 用户账号的添加、删除与修改。
* 用户密码的管理。
* 用户组的管理。

## 一、Linux系统用户账号的管理

用户账号的管理工作主要涉及到用户账号的添加、修改和删除。

添加用户账号就是在系统中创建一个新账号，然后为新账号分配用户ID、用户组、主目录和登录Shell等资源。刚添加的账号是被锁定的，无法使用。

### 1、添加用户

> useradd 命令用于 Linux 中创建新的系统用户，useradd 可用来建立用户帐号，帐号建好之后，再用 passwd 设定帐号的密码．而可用 userdel 删除帐号，使用 useradd 指令所建立的帐号，实际上是保存在 `/etc/passwd` 文本文件中。

添加一个新的用户账号使用`useradd`命令，其格式如下：

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

参数说明：

* 选项:
  * -c comment 指定一段注释性描述。
  * -d 目录 指定用户主目录，如果此目录不存在，则同时使用-m选项，可以创建主目录。
  * -g 用户组 指定用户所属的用户组。
  * -G 用户组，用户组 指定用户所属的附加组。
  * -s Shell文件 指定用户的登录Shell。
  * -u 用户号 指定用户的用户号，如果同时有-o选项，则可以重复使用其他用户的标识号。
* 用户名:指定新账号的登录名。

#### 案例**1**

```
useradd –d  /home/zhiqianghe -m zhiqianghe
```

此命令创建了一个用户zhiqianghe，其中-d和-m选项用来为登录名zhiqianghe产生一个主目录 /home/zhiqianghe（/home为默认的普通用户主目录所在的父目录）。

#### 案例2

这里可能新建组：

```
#groupadd zhiqiang
```

增加用户账号就是在/etc/passwd文件中为新用户增加一条记录，同时更新其他系统文件如/etc/shadow, /etc/group等。

```
useradd -c test -d /home/hezhiqiang -g zhiqiang -G adm,root -u 1111 -s /sbin/nologin hezhiqiang
```

新建一个用户hezhiqiang，-c描述该用户是测试，-d指定家目录在/home/hezhiqiang目录下，-g指定所属组是zhiqiang组，-G指定附加组是adm组和root组，-u指定用户id为1111，-s指定登陆Shell是 /sbin/nologin，hezhiqiang用户它属于zhiqiang用户组，同时又属于adm和root用户组，其中zhiqiang用户组是其主组，adm和root是其附加组。

![](/files/-MS7qBG0rA4unvYAogeO)

### 2、删除用户

> userdel 命令用于删除给定的用户，以及与用户相关的文件。若不加选项，则仅删除用户帐号，而不删除相关文件。

如果一个用户的账号不再使用，可以从系统中删除。删除用户账号就是要将/etc/passwd等系统文件中的该用户记录删除，必要时还删除用户的主目录。

删除一个已有的用户账号使用`userdel`命令，其格式如下：

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

常用的选项是 -r，它的作用是把用户的主目录一起删除。

参数说明：

* 选项:
  * -r 递归删除。
* 用户名:指定账号的登录名

#### 案例1

```
# userdel -r hezhiqiang
```

此命令删除用户hezhiqiang在系统文件中（主要是/etc/passwd, /etc/shadow, /etc/group等）的记录，同时删除用户的主目录。

### 3、修改用户

> usermod 命令用于修改用户的基本信息，usermod 命令不允许你改变正在线上的使用者帐号名称，当 usermod 命令用来改变 user id，必须确认这名 user 没执行任何程序，你需手动更改使用者的 crontab 档，也需手动更改使用者的 at 工作档，采用 NIS server 须在 server 上更动相关的 NIS 设定。

修改用户账号就是根据实际情况更改用户的有关属性，如用户ID、主目录、用户组、登录Shell等。

修改已有用户的信息使用`usermod`命令，其格式如下：

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

参数说明：

* 选项:
  * -c comment 指定一段注释性描述。
  * -d 目录 修改用户主目录，如果此目录不存在，则同时使用-m选项，可以创建主目录。
  * -g 用户组 修改用户所属的用户组。
  * -G 用户组，用户组 修改用户所属的附加组。
  * -s Shell文件 修改用户的登录Shell。
  * -u 用户号 修改用户的用户号，如果同时有-o选项，则可以重复使用其他用户的标识号。
  * -l  修改用户名，将原来的用户名改为新的用户名。
* 用户名:指定账号的登录名

#### 案列1

```
usermod -c modify -d /home/zhiqiang -m -g adm -G bin,root -u 1234 -s /bin/bash -l zhiqiang hezhiqiang
```

修改用户hezhiqiang属性，-c修改描述为修改，-d指定家目录为/home/zhiqiang目录下，-m配合-d使用修改主目录名为/home/zhiqiang，-g修改所属组是adm组，-G指定附加组是bin组和root组，-u修改用户id为1234，-s修改登陆Shell是 /bin/bash，-l将原来的用户名hezhiqiang改为新的用户名zhiqiang

![](/files/-MS86n-PJlgdq9teQ-W4)

### 4、用户密码的管理

> passwd 命令用于设置用户的认证信息，包括用户密码、密码过期时间等，系统管理者用它管理系统用户的密码。只有管理者可以指定用户名称，一般用户只能变更自己的密码。

用户管理的一项重要内容是用户密码的管理。用户账号刚创建时没有密码，但是被系统锁定，无法使用，必须为其设置密码后才可以使用，即使是指定空密码。

指定和修改用户密码的Shell命令是`passwd`。超级用户可以为自己和其他用户指定密码，普通用户只能用它修改自己的密码。命令的格式为：

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

* 选项:
  * -l   锁定密码，即禁用账号。
  * -u  密码解锁。
  * -d  使账号无密码。
  * -f   强迫用户下次登录时修改密码。
* 用户名:指定账号的登录名

如果默认用户名，则修改当前用户的密码。

例如，假设当前用户是zhiqiang，则下面的命令修改该用户自己的密码：

```
[zhiqiang@hezhiqiang ~]$ passwd 
新的 密码：********
重新输入新的 密码：********
passwd：所有的身份验证令牌已经成功更新。
```

如果是超级用户，可以用下列形式指定任何用户的密码：

```
[root@hezhiqiang ~]# passwd zhiqiang
更改用户 zhiqiang 的密码 。
新的 密码：********
重新输入新的 密码：********
passwd：所有的身份验证令牌已经成功更新。
```

普通用户修改自己的密码时，passwd命令会先询问原密码，验证后再要求用户输入两遍新密码，如果两次输入的密码一致，则将这个密码指定给用户；而超级用户为用户指定密码时，就不需要知道原密码。

为了系统安全起见，用户应该选择比较复杂的密码，例如最好使用8位长的密码，密码中包含有大写、小写字母和数字，并且应该与姓名、生日等不相同。

为用户指定空密码时，执行下列形式的命令：

```
# passwd -d zhiqiang
```

此命令将用户 zhiqiang 的密码删除，这样用户 zhiqiang 下一次登录时，系统就不再允许该用户登录了。

passwd 命令还可以用 -l(lock) 选项锁定某一用户，使其不能登录，例如：

```
# passwd -l zhiqiang
```

#### 非交互式给用户设置密码

**案列1**：非交互式给zhiqiang用户设置密码为123456

```
echo "123456" | passwd --stdin zhiqiang;
```

![](/files/-MS8aDzHAJv3yirqlFJC)

### 5、切换用户

> su 命令用于切换当前用户身份到其他用户身份，变更时须输入所要变更的用户帐号与密码。

`su`（英文全拼：swith user）命令的主要作用是让你可以在已登录的会话中切换到另外一个用户，换句话说，这个工具可以让你在不登出当前用户的情况下登录为另外一个用户。

`su` 命令经常被用于切换到超级用户或 root 用户（因为在命令行下工作，经常需要 root 权限），也可以用于切换到任意非 root 用户。

使用权限：所有使用者。

#### 语法

```
su [-fmp] [-c command] [-s shell] [--help] [--version] [-] [USER [ARG]]
```

**参数说明**：

* -f 或 --fast 不必读启动档（如 csh.cshrc 等），仅用于 csh 或 tcsh
* -m -p 或 --preserve-environment 执行 su 时不改变环境变数
* -c command 或 --command=command 变更为帐号为 USER 的使用者并执行指令（command）后再变回原来使用者
* -s shell 或 --shell=shell 指定要执行的 shell （bash csh tcsh 等），预设值为 /etc/passwd 内的该使用者（USER） shell
* \--help 显示说明文件
* \--version 显示版本资讯
* \- -l 或 --login 这个参数加了之后，就好像是重新 login 为该使用者一样，大部份环境变数（HOME SHELL USER等等）都是以该使用者（USER）为主，并且工作目录也会改变，如果没有指定 USER ，内定是 root
* USER 欲变更的使用者帐号
* ARG 传入新的 shell 参数

#### 案列1：

不带参数运行`su`命令

#### 切换用户：

```
[zhiqiang@hezhiqiang ~]$ whoami    # 显示当前用户
zhiqiang
[zhiqiang@hezhiqiang ~]$ pwd       # 显示当前目录
/home/zhiqiang
[zhiqiang@hezhiqiang ~]$ su root   # 切换到root用户
密码：********  <== 输入登入密码
[root@hezhiqiang zhiqiang]# whoami # 显示当前用户
root
[root@hezhiqiang zhiqiang]# pwd    # 显示当前目录
/home/zhiqiang
```

如上，`su` 命令要求输入的密码是 root 用户的密码。所以，一般 `su` 命令需要输入目标用户的密码。在输入正确的密码之后，`su` 命令会在终端的当前会话中打开一个子会话。

&#x20;还有一种方法可以切换到 root 用户：运行 `su -` 命令，如下：

#### 切换用户，改变环境变量

```
[zhiqiang@hezhiqiang ~]$ whoami    # 显示当前用户
zhiqiang
[zhiqiang@hezhiqiang ~]$ pwd       # 显示当前目录
/home/zhiqiang
[zhiqiang@hezhiqiang ~]$ su - root # 切换到root用户
密码：********  <== 输入登入密码
[root@hezhiqiang ~]# whoami        # 显示当前目录
root
[root@hezhiqiang ~]# pwd           # 显示当前目录
/root
```

#### &#x20;`su` 命令与 `su -` 命令区别：

前者在切换到 root 用户之后仍然保持旧的（或者说原始用户的）环境，而后者则是创建一个新的环境（由 root 用户 `~/.bashrc` 文件所设置的环境），相当于使用 root 用户正常登录。

#### ​案列2：

变更帐号为 root 并在执行 ls 指令后退出变回原使用者

```
su -c ls root
```

#### 案列3：

变更帐号为 root 并传入 -f 参数给新执行的 shell

```
su root -f
```

### 6、预设权限

> sudo 命令用来以其他身份来执行命令，预设的身份为 root，在 `/etc/sudoers` 中设置了可执行 sudo 指令的用户，若其未经授权的用户企图使用 sudo，则会发出警告的邮件给管理员，用户使用 sudo 时，必须先输入密码，之后有 5 分钟的有效期限，超过期限则必须重新输入密码。

Linux `sudo`命令以超级管理员的身份执行指令，也就是说，经由 `sudo` 所执行的指令就好像是 root 亲自执行。

使用权限：在 /etc/sudoers 中有出现的使用者。

#### 语法 <a href="#yu-fa" id="yu-fa"></a>

```
sudo [选项] [指令]
```

#### 参数说明： <a href="#can-shu" id="can-shu"></a>

* 选项
  * -b：在后台执行指令；&#x20;
  * -E：继承当前环境变量&#x20;
  * -h：显示帮助；&#x20;
  * -H：将HOME环境变量设为新身份的HOME环境变量；
  * -k：结束密码的有效期限，也就是下次再执行sudo时便需要输入密码；。&#x20;
  * -l：列出目前用户可执行与无法执行的指令；&#x20;
  * -p：改变询问密码的提示符号； -s：执行指定的shell；&#x20;
  * -u<用户>：以指定的用户作为新的身份。若不加上此参数，则预设以root作为新的身份；&#x20;
  * -v：延长密码有效期限5分钟；&#x20;
  * -V ：显示版本信息。
  * command 要以系统管理者身份（或以 -u 更改为其他人）执行的指令
* 指令：需要运行的指令和对应的参数。

#### 案例1：

```bash
# 指定用户执行ls命令
$ sudo -u userb ls -l
# 列出目前的权限
$ sudo -l
# 显示sudo设置
$ sudo -L
```

#### 预设普通用户 sudo 授权&#x20;

{% hint style="info" %}
配置sudo必须通过编辑/etc/sudoers文件，而且只有超级用户才可以修改它，还必须使用visudo编辑，之所以使用visudo有两个原因，

**一、它能够防止两个用户同时修改它；**

**二、它也能进行有限的语法检查。**

所以，即使只有你一个超级用户，你也最好用visudo来检查一下语法。
{% endhint %}

假设要给普通用户 `hezhiqiang` 配置 sudo 权限：

1. `/etc/sudoers` 文件存放了 sudo 的相关用户，但是默认是没有写权限的，所以需要设为可写：`chmod u+w /etc/sudoers`
2. 在该文件中添加 `hezhiqiang ALL=(ALL) ALL` ，保存并退出，让 `hezhiqiang` 具有 sudo 的所有权限
3. 再将 `/etc/sudoers` 的权限恢复到默认状态：`chmod u-w /etc/sudoers`

#### &#x20;免密码授权 sudo

与给普通用户授权 sudo 类似，区别仅在于第 2 步：`hezhiqiang ALL=(ALL) NOPASSWD: ALL`。

## 二、Linux系统用户组的管理

每个用户都有一个用户组，系统可以对一个用户组中的所有用户进行集中管理，不同Linux 系统对用户组的规定有所不同，如Linux下的用户属于与它同名的用户组，这个用户组在创建用户时同时创建。

用户组的管理涉及用户组的添加、删除和修改，组的增加、删除和修改实际上就是对/etc/group文件的更新。

### ​1、添加用户组

> groupadd 命令用于创建一个新的用户组，新用户组的信息将被添加到系统文件中。

增加一个新的用户组使用groupadd命令。其格式如下：

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

* 选项：
  * -g GID 指定新用户组的组标识号（GID）。
  * -o 一般与-g选项同时使用，表示新用户组的GID可以与系统已有用户组的GID相同。
* 用户组:指定用户的所属组名

#### **案列1：**

```
# groupadd group1
```

此命令向系统中增加了一个新组group1，新组的组标识号是在当前已有的最大组标识号的基础上加1。

#### **实例2：**

```
# groupadd -g 101 group2
```

此命令向系统中增加了一个新组group2，同时指定新组的组标识号是101。

### 2、删除用户组

> groupdel 命令用于删除指定的用户组，本命令要修改的系统文件包括 `/ect/group` 和 `/ect/gshadow`。若该群组中仍包括某些用户，则必须先删除这些用户后，才能删除群组。

{% hint style="danger" %}

#### 注意：不能删除用户的主组

{% endhint %}

如果要删除一个已有的用户组，使用`groupdel`命令，其格式如下：

```
groupdel 用户组
```

**例如：**

```
# groupdel group1
```

此命令从系统中删除组group1。

![](/files/-MSOpBRRxyepC09WXp3Z)

### 3、修改用户组

> groupmod 命令更改群组识别码或名称。需要更改群组的识别码或名称时，可用 groupmod 指令来完成这项工作。

修改用户组的属性使用`groupmod`命令。其语法如下：

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

* 选项：
  * -g GID 指定新用户组的组标识号（GID）。
  * -o 一般与-g选项同时使用，表示新用户组的GID可以与系统已有用户组的GID相同。
  * -n 新用户组 将用户组的名字改为新名字
* 用户组:指定用户的所属组名

#### **案列1：**

```
# groupmod -g 102 group2
```

此命令将组group2的组标识号修改为102。

#### **实例2：**

```
# groupmod –g 10000 -n group3 group2
```

此命令将组group2的标识号改为10000，组名修改为group3。

### 4、切换用户组

如果一个用户同时属于多个用户组，那么用户可以在用户组之间切换，以便具有其他用户组的权限。

用户可以在登录后，使用命令newgrp切换到其他用户组，

切换用户组使用`newgrp`命令。其语法如下：

```
$ newgrp 目的用户组
```

例如：

```
$ newgrp root
```

这条命令将当前用户切换到root用户组，前提条件是root用户组确实是该用户的主组或附加组。类似于用户账号的管理，用户组的管理也可以通过集成的系统管理工具来完成。

### 5、将用户添加到组或从组中删除

Linux gpasswd 是 Linux 下工作组文件 /etc/group 和 /etc/gshadow 管理工具，用于将一个用户添加到组或者从组中删除。

将一个用户添加到组或者从组中删除使用`gpasswd`命令。其语法如下：

```
gpasswd [选项] 组名
```

**选项**：

* -a：添加用户到组；
* -d：从组删除用户；
* -A：指定管理员；
* -M：指定组成员和-A的用途差不多；
* -r：删除密码；
* -R：限制用户登入组，只有组中的成员才可以用newgrp加入该组。

#### 案列1

为组设置密码

```
gpasswd groupname
```

#### 案列2

将dc用户设置为zhiqiang组的管理员

```
gpasswd -A dc zhiqiang
```

#### 案列3

添加用户到一个组，保留原组

{% hint style="danger" %}
**注意**：添加用户到某一个组 可以使用 usermod -G group\_name user\_name 这个命令可以添加一个用户到指定的组，但是以前添加的组就会清空掉。
{% endhint %}

所以想要添加一个用户到一个组，同时保留以前添加的组时，使用 gpasswd 这个命令来添加操作用户：

```
gpasswd -a user_name group_name
```

![](/files/-MSOewmZwtXI_dnO-p2e)

## 三、账号系统文件

与用户账号有关的系统文件

完成用户管理的工作有许多种方法，但是每一种方法实际上都是对有关的系统文件进行修改。

与用户和用户组相关的信息都存放在一些系统文件中，这些文件包括/etc/passwd, /etc/shadow, /etc/group等。

下面分别介绍这些文件的内容。

### 1、/etc/passwd文件

/etc/passwd文件是用户管理工作涉及的最重要的一个文件。

Linux系统中的每个用户都在/etc/passwd文件中有一个对应的记录行，它记录了这个用户的一些基本属性。

这个文件对所有用户都是可读的。它的内容类似下面的例子：

```
＃ cat /etc/passwd

root:x:0:0:Superuser:/:
daemon:x:1:1:System daemons:/etc:
bin:x:2:2:Owner of system commands:/bin:
sys:x:3:3:Owner of system files:/usr/sys:
adm:x:4:4:System accounting:/usr/adm:
uucp:x:5:5:UUCP administrator:/usr/lib/uucp:
auth:x:7:21:Authentication administrator:/tcb/files/auth:
cron:x:9:16:Cron daemon:/usr/spool/cron:
listen:x:37:4:Network daemon:/usr/net/nls:
lp:x:71:18:Printer administrator:/usr/spool/lp:
sam:x:200:50:Sam san:/home/sam:/bin/sh
```

从上面的例子我们可以看到，/etc/passwd中一行记录对应着一个用户，每行记录又被冒号(:)分隔为7个字段，其格式和具体含义如下：

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

{% hint style="success" %}

#### 1）"用户名"是代表用户账号的字符串。

通常长度不超过8个字符，并且由大小写字母和/或数字组成。登录名中不能有冒号(:)，因为冒号在这里是分隔符。

为了兼容起见，登录名中最好不要包含点字符(.)，并且不使用连字符(-)和加号(+)打头。

#### 2）“口令”一些系统中，存放着加密后的用户口令字。

虽然这个字段存放的只是用户口令的加密串，不是明文，但是由于/etc/passwd文件对所有用户都可读，所以这仍是一个安全隐患。因此，现在许多Linux 系统（如SVR4）都使用了shadow技术，把真正的加密后的用户口令字存放到/etc/shadow文件中，而在/etc/passwd文件的口令字段中只存放一个特殊的字符，例如“x”或者“\*”。

#### 3）“用户标识号”是一个整数，系统内部用它来标识用户。

一般情况下它与用户名是一一对应的。如果几个用户名对应的用户标识号是一样的，系统内部将把它们视为同一个用户，但是它们可以有不同的口令、不同的主目录以及不同的登录Shell等。

通常用户标识号的取值范围是0～65 535。0是超级用户root的标识号，1～99由系统保留，作为管理账号，普通用户的标识号从100开始。在Linux系统中，这个界限是500。

#### 4）“组标识号”字段记录的是用户所属的用户组。

它对应着/etc/group文件中的一条记录。

#### 5)“注释性描述”字段记录着用户的一些个人情况。

例如用户的真实姓名、电话、地址等，这个字段并没有什么实际的用途。在不同的Linux 系统中，这个字段的格式并没有统一。在许多Linux系统中，这个字段存放的是一段任意的注释性描述文字，用做finger命令的输出。

#### 6)“主目录”，也就是用户的起始工作目录。

它是用户在登录到系统之后所处的目录。在大多数系统中，各用户的主目录都被组织在同一个特定的目录下，而用户主目录的名称就是该用户的登录名。各用户对自己的主目录有读、写、执行（搜索）权限，其他用户对此目录的访问权限则根据具体情况设置。

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

Shell是用户与Linux系统之间的接口。Linux的Shell有许多种，每种都有不同的特点。常用的有sh(Bourne Shell), csh(C Shell), ksh(Korn Shell), tcsh(TENEX/TOPS-20 type C Shell), bash(Bourne Again Shell)等。

系统管理员可以根据系统情况和用户习惯为用户指定某个Shell。如果不指定Shell，那么系统使用sh为默认的登录Shell，即这个字段的值为/bin/sh。

用户的登录Shell也可以指定为某个特定的程序（此程序不是一个命令解释器）。

利用这一特点，我们可以限制用户只能运行指定的应用程序，在该应用程序运行结束后，用户就自动退出了系统。有些Linux 系统要求只有那些在系统中登记了的程序才能出现在这个字段中。

#### 8)系统中有一类用户称为伪用户（pseudo users）。

这些用户在/etc/passwd文件中也占有一条记录，但是不能登录，因为它们的登录Shell为空。它们的存在主要是方便系统管理，满足相应的系统进程对文件属主的要求。
{% endhint %}

常见的伪用户如下所示：

```
伪 用 户 含 义 
bin 拥有可执行的用户命令文件 
sys 拥有系统文件 
adm 拥有帐户文件 
uucp UUCP使用 
lp lp或lpd子系统使用 
nobody NFS使用
```

### **2、/etc/shadow文件**

#### 拥有帐户文件

**除了上面列出的伪用户外，还有许多标准的伪用户，例如：audit, cron, mail, usenet等，它们也都各自为相关的进程和文件所需要。**

由于/etc/passwd文件是所有用户都可读的，如果用户的密码太简单或规律比较明显的话，一台普通的计算机就能够很容易地将它破解，因此对安全性要求较高的Linux系统都把加密后的口令字分离出来，单独存放在一个文件中，这个文件是/etc/shadow文件。 有超级用户才拥有该文件读权限，这就保证了用户密码的安全性。

**/etc/shadow中的记录行与/etc/passwd中的一一对应，它由pwconv命令根据/etc/passwd中的数据自动产生**

它的文件格式与/etc/passwd类似，由若干个字段组成，字段之间用":"隔开。这些字段是：

```
登录名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:标志
```

{% hint style="success" %}

1. "登录名"是与/etc/passwd文件中的登录名相一致的用户账号
2. "口令"字段存放的是加密后的用户口令字，长度为13个字符。如果为空，则对应用户没有口令，登录时不需要口令；如果含有不属于集合 { ./0-9A-Za-z }中的字符，则对应的用户不能登录。
3. "最后一次修改时间"表示的是从某个时刻起，到用户最后一次修改口令时的天数。时间起点对不同的系统可能不一样。例如在SCO Linux 中，这个时间起点是1970年1月1日。
4. "最小时间间隔"指的是两次修改口令之间所需的最小天数。
5. "最大时间间隔"指的是口令保持有效的最大天数。
6. "警告时间"字段表示的是从系统开始警告用户到用户密码正式失效之间的天数。
7. "不活动时间"表示的是用户没有登录活动但账号仍能保持有效的最大天数。
8. "失效时间"字段给出的是一个绝对的天数，如果使用了这个字段，那么就给出相应账号的生存期。期满后，该账号就不再是一个合法的账号，也就不能再用来登录了。
   {% endhint %}

下面是/etc/shadow的一个例子：

```
＃ cat /etc/shadow

root:Dnakfw28zf38w:8764:0:168:7:::
daemon:*::0:0::::
bin:*::0:0::::
sys:*::0:0::::
adm:*::0:0::::
uucp:*::0:0::::
nuucp:*::0:0::::
auth:*::0:0::::
cron:*::0:0::::
listen:*::0:0::::
lp:*::0:0::::
sam:EkdiSECLWPdSa:9740:0:0::::
```

### 3、/etc/group文件

用户组的所有信息都存放在/etc/group文件中。

将用户分组是Linux 系统中对用户进行管理及控制访问权限的一种手段。

每个用户都属于某个用户组；一个组中可以有多个用户，一个用户也可以属于不同的组。

当一个用户同时是多个组中的成员时，在/etc/passwd文件中记录的是用户所属的主组，也就是登录时所属的默认组，而其他组称为附加组。

用户要访问属于附加组的文件时，必须首先使用newgrp命令使自己成为所要访问的组中的成员。

用户组的所有信息都存放在/etc/group文件中。此文件的格式也类似于/etc/passwd文件，由冒号(:)隔开若干个字段，这些字段有：

```
组名:口令:组标识号:组内用户列表
```

{% hint style="success" %}

1. "组名"是用户组的名称，由字母或数字构成。与/etc/passwd中的登录名一样，组名不应重复。
2. "口令"字段存放的是用户组加密后的口令字。一般Linux 系统的用户组都没有口令，即这个字段一般为空，或者是\*。
3. "组标识号"与用户标识号类似，也是一个整数，被系统内部用来标识组。
4. "组内用户列表"是属于这个组的所有用户的列表，不同用户之间用逗号(,)分隔。这个用户组可能是用户的主组，也可能是附加组。
   {% endhint %}

/etc/group文件的一个例子如下：

```
[root@hezhiqiang ~]# cat /etc/group
root:x:0:zhiqiang
bin:x:1:zhiqiang
daemon:x:2:
```

## 四、添加批量用户

添加和删除用户对每位Linux系统管理员都是轻而易举的事，比较棘手的是如果要添加几十个、上百个甚至上千个用户时，我们不太可能还使用useradd一个一个地添加，必然要找一种简便的创建大量用户的方法。

### **1、利用脚本批量增加用户**

创建脚本：`vim useradd.sh`，批量创建用户user01-user10,并生成8个字符的随机密码

```
#!/bin/bash
#说明：批量创建10个用户并随机生成8个字符的密码
[ -f /etc/init.d/functions ] && source /etc/init.d/functions
#判断是否当前用户是否为root用户
if [ $UID -ne 0 ];then
  echo "Pls run this script by root"
  exit 1
fi
#for循环批量创建用户
for user in user{01..10}
  do
    #判断要创建的用户是否已经存在。如果存在，给出错误提示，继续下一次循环
    num=$(grep -w "$user" /etc/passwd | wc -l)
    if [ $num -ne 0 ];then
      action "useradd: user $user already exists" /bin/false
      continue
    fi
    #生成8位随机字符，并赋值给变量pass
    password=$(echo $RANDOM | md5sum | cut -c 1-8)
    #循环创建用户，成功之后执行下一条语句
    useradd $user && \
    #非交互设置用户密码，不打印输出
    echo $password | passwd --stdin $user >/dev/null 2>&1
    #判断用户是否创建成功
    RETVEL=$?
    if [ $RETVEL -eq 0 ];then
         action "useradd: $user successfully" /bin/true
      else
         action "useradd: $user failed" /bin/false
    fi
    #将用户名和密码写入到/tmp/password.txt文件当中
    echo -e "$user\t$password" >> /tmp/password.txt
done
```

![](/files/-MS9G8zHCK9N7aTM7nIO)

### **2、利用脚本批量删除用户**

创建脚本：`vim userdel.sh`

```
#!/bin/bash
#说明:用for循环批量删除用户
for user in user{01..10}
         do
                 userdel -r $user
                 echo "$user用户已成功删除"
         done
```

### **3、手动批量添加**

1.先编辑一个文本用户文件\
每一列按照/etc/passwd密码文件的格式书写，要注意每个用户的用户名、UID、宿主目录都不可以相同，其中密码栏可以留做空白或输入x号。一个范例文件`useradd.txt`内容如下：

```
user001::600:100:user:/home/user001:/bin/bash
user002::601:100:user:/home/user002:/bin/bash
user003::602:100:user:/home/user003:/bin/bash
user004::603:100:user:/home/user004:/bin/bash
user005::604:100:user:/home/user005:/bin/bash
user006::605:100:user:/home/user006:/bin/bash
```

2.以root身份执行命令 `/usr/sbin/newusers`,从刚创建的用户文件`useradd.txt`中导入数据，创建用户：

```
newusers < useradd.txt
```

3.执行命令 `/user/sbin/pwunconv` 将 `/etc/shadow` 产生的 shadow 密码解码，然后回写到 `/etc/passwd` 中，并将`/etc/shadow`的shadow密码栏删掉。这是为了方便下一步的密码转换工作，即先取消 shadow password 功能

```
pwunconv
```

4.编辑每个用户的密码对照文件，范例文件`passwd.txt`内容如下：

```
user001:123456
user002:123456
user003:123456
user004:123456
user005:123456
user006:123456
```

5.以root身份执行命令 `/usr/sbin/chpasswd`\
创建用户密码，chpasswd 会将经过 `/usr/bin/passwd` 命令编码过的密码写入 `/etc/passwd` 的密码栏

```
chpasswd < passwd.txt
```

6.确定密码经编码写入`/etc/passwd`的密码栏后\
执行命令 `/usr/sbin/pwconv` 将密码编码为 shadow password，并将结果写入 `/etc/shadow`

```
pwconv
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://hezhiqiang.gitbook.io/about-the-author/linux-yun-wei-guan-li/linux-guan-li-yong-hu-he-zu.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
