# Linux 用户管理命令 - 详解用户与组管理工具

URL: https://caijiao.org/linux/user-management/commands
Source: docs/linux/user-management/commands.md
Description: 全面介绍 Linux 系统中用于用户和组管理的各种命令，包括创建、修改、删除用户和组，设置密码策略，以及权限管理等操作。

## 1. 用户账户管理命令

### 1.1 useradd - 创建新用户

`useradd` 命令用于在 Linux 系统中创建新的用户账户。

**语法**：
```bash
useradd [选项] 用户名
```

**常用选项**：
- `-c, --comment COMMENT`：添加用户的描述信息
- `-d, --home HOME_DIR`：指定用户的主目录路径
- `-e, --expiredate EXPIRE_DATE`：设置账户过期日期，格式为 YYYY-MM-DD
- `-g, --gid GROUP`：指定用户的主组名称或 GID
- `-G, --groups GROUPS`：指定用户的附加组列表，多个组用逗号分隔
- `-m, --create-home`：自动创建用户的主目录
- `-M, --no-create-home`：不创建用户的主目录
- `-N, --no-user-group`：不创建与用户名同名的组
- `-p, --password PASSWORD`：设置用户密码（已加密的密码）
- `-s, --shell SHELL`：指定用户的登录 shell
- `-u, --uid UID`：指定用户的 UID

**示例**：
```bash
# 创建基本用户账户
useradd john

# 创建用户并设置主目录、shell 和描述信息
useradd -m -s /bin/bash -c "John Doe" john

# 创建用户并指定 UID、主组和附加组
useradd -u 1005 -g developers -G sudo,users -m mary

# 创建系统用户（无登录 shell）
useradd -r -s /usr/sbin/nologin mysql

# 创建带有过期日期的用户
useradd -e 2023-12-31 temp_user
```

### 1.2 userdel - 删除用户账户

`userdel` 命令用于从系统中删除用户账户。

**语法**：
```bash
userdel [选项] 用户名
```

**常用选项**：
- `-f, --force`：强制删除用户，即使用户当前已登录
- `-r, --remove`：删除用户的主目录和邮件文件
- `-Z, --selinux-user`：删除用户的 SELinux 用户映射

**示例**：
```bash
# 删除用户，但保留主目录
userdel john

# 删除用户及其主目录和邮件
userdel -r mary

# 强制删除用户
userdel -f temp_user
```

### 1.3 usermod - 修改用户账户属性

`usermod` 命令用于修改现有用户账户的属性。

**语法**：
```bash
usermod [选项] 用户名
```

**常用选项**：
- `-c, --comment COMMENT`：修改用户的描述信息
- `-d, --home HOME_DIR`：修改用户的主目录路径
- `-e, --expiredate EXPIRE_DATE`：修改账户过期日期
- `-g, --gid GROUP`：修改用户的主组
- `-G, --groups GROUPS`：修改用户的附加组列表
- `-l, --login NEW_LOGIN`：修改用户名
- `-L, --lock`：锁定用户账户，禁止登录
- `-s, --shell SHELL`：修改用户的登录 shell
- `-u, --uid UID`：修改用户的 UID
- `-U, --unlock`：解锁用户账户
- `-a, --append`：将用户追加到附加组，而不是替换现有组

**示例**：
```bash
# 修改用户的描述信息
usermod -c "Senior Developer" john

# 修改用户的登录 shell
usermod -s /bin/zsh mary

# 修改用户的主目录
usermod -d /home/jdoe john

# 修改用户的主组
usermod -g managers john

# 将用户添加到附加组（不替换现有组）
usermod -a -G sudo,devops john

# 修改用户名
usermod -l john_doe john

# 锁定用户账户
usermod -L temp_user

# 解锁用户账户
usermod -U temp_user
```

### 1.4 passwd - 设置或修改用户密码

`passwd` 命令用于设置或修改用户的密码。

**语法**：
```bash
passwd [选项] [用户名]
```

**常用选项**：
- `-d, --delete`：删除用户的密码，使用户账户无需密码即可登录
- `-e, --expire`：强制用户下次登录时修改密码
- `-i, --inactive INACTIVE`：设置密码过期后账户宽限期天数
- `-l, --lock`：锁定用户密码
- `-n, --minimum DAYS`：设置密码最小修改间隔天数
- `-S, --status`：显示用户密码的状态
- `-u, --unlock`：解锁用户密码
- `-w, --warning DAYS`：设置密码过期前的警告天数
- `-x, --maximum DAYS`：设置密码最长有效期天数

**示例**：
```bash
# 修改当前用户的密码
passwd

# 修改指定用户的密码（需要管理员权限）
passwd john

# 删除用户的密码
passwd -d temp_user

# 强制用户下次登录时修改密码
passwd -e john

# 锁定用户密码
passwd -l mary

# 解锁用户密码
passwd -u mary

# 查看密码状态
passwd -S john

# 设置密码策略（最小5天，最大90天，提前7天警告）
passwd -n 5 -x 90 -w 7 john
```

### 1.5 chage - 修改用户密码过期信息

`chage` 命令用于管理用户的密码过期策略。

**语法**：
```bash
chage [选项] 用户名
```

**常用选项**：
- `-d, --lastday LAST_DAY`：设置最后一次密码修改日期
- `-E, --expiredate EXPIRE_DATE`：设置账户过期日期
- `-I, --inactive INACTIVE`：设置密码过期后账户宽限期天数
- `-l, --list`：列出用户的密码过期信息
- `-m, --mindays MIN_DAYS`：设置密码最小修改间隔天数
- `-M, --maxdays MAX_DAYS`：设置密码最长有效期天数
- `-W, --warndays WARN_DAYS`：设置密码过期前的警告天数

**示例**：
```bash
# 列出用户的密码过期信息
chage -l john

# 设置用户密码 90 天后过期
chage -M 90 john

# 设置账户在特定日期过期
chage -E 2023-12-31 temp_user

# 设置密码修改后，用户必须等待 3 天后才能再次修改
chage -m 3 john

# 设置密码过期前 7 天开始警告
chage -W 7 john
# 设置密码过期后，账户还有 14 天的宽限期
chage -I 14 john
```

### 1.6 finger - 查看用户信息

`finger` 命令用于显示用户的详细信息。

**语法**：
```bash
finger [选项] [用户名]
```

**常用选项**：
- `-l`：以长格式显示信息
- `-m`：仅匹配用户名（忽略大小写）

**示例**：
```bash
# 查看所有登录用户的信息
finger

# 查看特定用户的信息
finger john

# 以长格式查看用户信息
finger -l mary
```

### 1.7 id - 显示用户和组的 ID

`id` 命令用于显示用户的 UID、GID 和所属的组。

**语法**：
```bash
id [选项] [用户名]
```

**常用选项**：
- `-g, --group`：仅显示用户的主组 ID
- `-G, --groups`：显示用户所属的所有组 ID
- `-n, --name`：与 -g 或 -G 一起使用，显示组名而非 GID
- `-u, --user`：仅显示用户的 UID

**示例**：
```bash
# 显示当前用户的 ID 信息
id

# 显示指定用户的 ID 信息
id john

# 仅显示用户的 UID
id -u mary

# 仅显示用户的主组 ID
id -g john

# 显示用户所属的所有组名
id -Gn john
```

### 1.8 last - 显示用户登录历史

`last` 命令用于显示用户的登录历史记录。

**语法**：
```bash
last [选项] [用户名]
```

**常用选项**：
- `-n, --limit NUMBER`：显示最近的 N 条记录
- `-f, --file FILE`：指定替代的日志文件
- `-t, --until YYYYMMDDHHMMSS`：显示指定日期之前的记录

**示例**：
```bash
# 显示所有用户的最近登录记录
last

# 显示特定用户的登录记录
last john

# 显示最近 10 条登录记录
last -n 10

# 显示特定日期之前的登录记录
last -t 20230630000000
```

### 1.9 who - 显示当前登录用户

`who` 命令用于显示当前登录到系统的用户信息。

**语法**：
```bash
who [选项]
```

**常用选项**：
- `-a, --all`：显示所有信息
- `-b, --boot`：显示系统启动时间
- `-d, --dead`：显示已终止的进程
- `-H, --heading`：显示列标题
- `-l, --login`：显示登录进程
- `-m`：仅显示当前终端的信息（相当于 who am i）
- `-q, --count`：仅显示用户数和用户名列表
- `-r, --runlevel`：显示当前运行级别

**示例**：
```bash
# 显示当前登录用户
who

# 显示详细信息，包括列标题
who -aH

# 显示系统启动时间
who -b

# 显示当前运行级别
who -r

# 显示当前终端信息
who am i
# 或
who -m
```

## 2. 组管理命令

### 2.1 groupadd - 创建新组

`groupadd` 命令用于在系统中创建新的用户组。

**语法**：
```bash
groupadd [选项] 组名
```

**常用选项**：
- `-f, --force`：如果组已存在，则退出状态为 0 而不是错误
- `-g, --gid GID`：指定组的 GID
- `-r, --system`：创建系统组

**示例**：
```bash
# 创建基本组
groupadd developers

# 创建指定 GID 的组
groupadd -g 1005 testers

# 创建系统组
groupadd -r mysql
```

### 2.2 groupdel - 删除组

`groupdel` 命令用于从系统中删除组。

**语法**：
```bash
groupdel [选项] 组名
```

**注意**：
- 不能删除任何用户的主组
- 如果组中有用户，则必须先移除用户

**示例**：
```bash
# 删除组
groupdel testers
```

### 2.3 groupmod - 修改组属性

`groupmod` 命令用于修改现有组的属性。

**语法**：
```bash
groupmod [选项] 组名
```

**常用选项**：
- `-g, --gid GID`：修改组的 GID
- `-n, --new-name NEW_GROUP`：修改组的名称

**示例**：
```bash
# 修改组的 GID
groupmod -g 1006 developers

# 修改组的名称
groupmod -n dev_team developers
```

### 2.4 gpasswd - 管理组密码和成员

`gpasswd` 命令用于管理组密码和组成员。

**语法**：
```bash
gpasswd [选项] [组名]
```

**常用选项**：
- `-a, --add USER`：将用户添加到组
- `-d, --delete USER`：从组中删除用户
- `-A, --administrators ADMIN,...`：设置组管理员
- `-M, --members USER,...`：设置组成员列表
- `-r, --remove-password`：删除组密码
- `-R, --restrict`：限制组访问

**示例**：
```bash
# 将用户添加到组
gpasswd -a john developers

# 从组中删除用户
gpasswd -d mary developers

# 设置组管理员
gpasswd -A john,admin developers

# 设置组成员列表
gpasswd -M john,mary,peter developers

# 删除组密码
gpasswd -r developers
```

### 2.5 newgrp - 切换当前用户的有效组

`newgrp` 命令用于临时切换用户的当前有效组。

**语法**：
```bash
newgrp [选项] [组名]
```

**常用选项**：
- `-`：创建一个新的 shell 环境

**示例**：
```bash
# 切换到指定组
newgrp developers

# 切换到指定组并创建新的 shell 环境
newgrp - developers
```

## 3. 权限管理命令

### 3.1 chmod - 修改文件或目录的权限

`chmod` 命令用于修改文件或目录的访问权限。

**语法**：
```bash
chmod [选项] 模式 文件/目录
```

**常用选项**：
- `-R, --recursive`：递归修改目录及其内容的权限
- `-v, --verbose`：显示详细的权限修改信息

**模式表示方法**：
- 符号模式：`u`（所有者）、`g`（组）、`o`（其他）、`a`（全部）；`+`（添加权限）、`-`（删除权限）、`=`（设置权限）；`r`（读）、`w`（写）、`x`（执行）
- 数字模式：每类用户用一个八进制数字表示，权限对应的值为：`r=4`、`w=2`、`x=1`

**示例**：
```bash
# 符号模式：给所有者添加执行权限
chmod u+x script.sh

# 符号模式：给组添加读和写权限
chmod g+rw file.txt

# 符号模式：删除其他用户的所有权限
chmod o-rwx file.txt

# 数字模式：设置所有者读/写/执行，组读/执行，其他读权限
chmod 754 file.txt

# 递归修改目录权限
chmod -R 755 /path/to/directory

# 详细显示权限修改
chmod -v 644 file.txt
```

### 3.2 chown - 修改文件或目录的所有者和组

`chown` 命令用于修改文件或目录的所有者和所属组。

**语法**：
```bash
chown [选项] 所有者[:组] 文件/目录
```

**常用选项**：
- `-R, --recursive`：递归修改目录及其内容的所有者和组
- `-v, --verbose`：显示详细的所有者和组修改信息

**示例**：
```bash
# 修改文件的所有者
chown john file.txt

# 修改文件的所有者和组
chown john:developers file.txt

# 仅修改文件的组
chown :developers file.txt

# 递归修改目录的所有者和组
chown -R john:developers /path/to/directory

# 详细显示修改信息
chown -v john file.txt
```

### 3.3 chgrp - 修改文件或目录的所属组

`chgrp` 命令用于修改文件或目录的所属组。

**语法**：
```bash
chgrp [选项] 组 文件/目录
```

**常用选项**：
- `-R, --recursive`：递归修改目录及其内容的所属组
- `-v, --verbose`：显示详细的所属组修改信息

**示例**：
```bash
# 修改文件的所属组
chgrp developers file.txt

# 递归修改目录的所属组
chgrp -R developers /path/to/directory

# 详细显示修改信息
chgrp -v developers file.txt
```

### 3.4 umask - 设置默认文件权限

`umask` 命令用于设置新创建文件和目录的默认权限掩码。

**语法**：
```bash
umask [选项] [掩码]
```

**常用选项**：
- `-S, --symbolic`：以符号方式显示掩码

**示例**：
```bash
# 显示当前的 umask 值
umask

# 以符号方式显示 umask 值
umask -S

# 设置新的 umask 值（文件默认权限为 644，目录默认权限为 755）
umask 022

# 设置更严格的 umask 值（文件默认权限为 600，目录默认权限为 700）
umask 077
```

## 4. sudo 权限管理

### 4.1 sudo - 以其他用户身份执行命令

`sudo` 命令允许授权用户以其他用户（通常是 root）的身份执行命令。

**语法**：
```bash
sudo [选项] 命令
```

**常用选项**：
- `-b, --background`：在后台运行命令
- `-i, --login`：以目标用户身份登录并运行 shell
- `-l, --list`：列出用户可以执行的命令
- `-s, --shell`：运行指定的 shell
- `-u, --user=USER`：以指定用户身份执行命令
-V, --version：显示版本信息

**示例**：
```bash
# 以 root 身份执行命令
sudo apt update

# 以特定用户身份执行命令
sudo -u john ls -la /home/john

# 列出用户可以执行的 sudo 命令
sudo -l

# 以 root 身份登录 shell
sudo -i
# 或
sudo su -

# 在后台运行命令
sudo -b systemctl restart nginx
```

### 4.2 visudo - 安全编辑 sudoers 文件

`visudo` 命令用于安全地编辑 `/etc/sudoers` 文件，提供了语法检查功能。

**语法**：
```bash
visudo [选项]
```

**常用选项**：
- `-f, --file=FILE`：编辑指定的 sudoers 文件
- `-c, --check`：检查 sudoers 文件的语法
- `-s, --strict`：严格检查模式

**示例**：
```bash
# 编辑主 sudoers 文件
visudo

# 检查 sudoers 文件语法
visudo -c

# 编辑指定的 sudoers 文件
visudo -f /etc/sudoers.d/custom
```

## 5. 高级用户管理技术

### 5.1 PAM (Pluggable Authentication Modules)

PAM 是 Linux 系统中的可插拔认证模块，提供了灵活的认证机制。

**配置文件**：
- `/etc/pam.d/`：包含各服务的 PAM 配置文件
- `/etc/security/`：包含 PAM 模块的配置文件

**常用 PAM 模块**：
- `pam_unix`：标准 Unix 认证
- `pam_cracklib`：密码强度检查
- `pam_tally2`：登录失败次数限制
- `pam_limits`：资源限制

**示例**：设置密码强度策略（编辑 `/etc/pam.d/system-auth`）：
```
password requisite pam_cracklib.so retry=3 minlen=8 difok=3 ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1
```

**示例**：设置登录失败锁定策略（编辑 `/etc/pam.d/system-auth`）：
```
auth required pam_tally2.so deny=5 unlock_time=1800 even_deny_root root_unlock_time=1800
```

### 5.2 资源限制配置

`/etc/security/limits.conf` 文件用于设置系统资源限制，控制用户可以使用的系统资源量。

**配置格式**：
```
username|@groupname type resource limit
```

**常用资源类型**：
- `core`：core 文件大小限制
- `data`：进程数据段大小限制
- `fsize`：文件大小限制
- `memlock`：最大锁定内存地址空间
- `nofile`：最大打开文件数
- `stack`：最大堆栈大小
- `cpu`：CPU 时间限制
- `nproc`：最大进程数

**示例**：限制用户最多打开 1024 个文件：
```
john hard nofile 1024
```

**示例**：限制组最多创建 50 个进程：
```
@developers hard nproc 50
```

## 6. 总结

Linux 用户管理命令提供了全面的功能，用于创建、修改、删除用户和组，以及管理权限和资源限制。本文详细介绍了各种用户管理命令的语法、选项和使用示例。

通过本文的学习，您应该能够：

- 使用 useradd、userdel、usermod 等命令管理用户账户
- 使用 groupadd、groupdel、groupmod 等命令管理用户组
- 使用 chmod、chown、chgrp 等命令管理文件和目录的权限
- 使用 passwd 和 chage 命令设置密码策略
- 使用 sudo 和 visudo 命令管理管理员权限
- 了解 PAM 和资源限制配置等高级用户管理技术

掌握这些命令对于系统管理员来说是必不可少的，它们提供了强大的工具来维护 Linux 系统的安全性和多用户环境的管理。在使用这些命令时，应特别注意权限问题，并遵循最小权限原则，以确保系统的安全和稳定。
