# 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是其附加组。

![](https://139036132-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lx53lMutrsyPUks5pJf%2F-MS7pt5kSYn6-7xT6m0L%2F-MS7qBG0rA4unvYAogeO%2Fimage.png?alt=media\&token=cc687d7d-1ebb-4290-af8a-a10f6d075c14)

### 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

![](https://139036132-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lx53lMutrsyPUks5pJf%2F-MS863cHIge98DMi6EHY%2F-MS86n-PJlgdq9teQ-W4%2Fimage.png?alt=media\&token=98581e69-a4fc-4472-9752-93ebfc5f04df)

### 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;
```

![](https://139036132-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lx53lMutrsyPUks5pJf%2F-MS8a53JsZ3pJfwOjlf4%2F-MS8aDzHAJv3yirqlFJC%2Fimage.png?alt=media\&token=34568f4b-a29e-456c-94c9-7a41389d4d2e)

### 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。

![](https://139036132-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lx53lMutrsyPUks5pJf%2F-MSOoPGCP0D7InceijYH%2F-MSOpBRRxyepC09WXp3Z%2Fimage.png?alt=media\&token=77a69978-929a-42c3-8dba-d27b31154dd2)

### 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
```

![](https://139036132-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lx53lMutrsyPUks5pJf%2F-MSOcIyLLxm5Lte2Mqaq%2F-MSOewmZwtXI_dnO-p2e%2Fimage.png?alt=media\&token=5bc0c902-683e-4ebd-9368-af4ce1382e83)

## 三、账号系统文件

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

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

与用户和用户组相关的信息都存放在一些系统文件中，这些文件包括/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
```

![](https://139036132-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lx53lMutrsyPUks5pJf%2F-MS9FbeHr9j4P1hk65vM%2F-MS9G8zHCK9N7aTM7nIO%2Fimage.png?alt=media\&token=d19157c7-f710-438b-abfa-11901b3eae0d)

### **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
```
