Linux: 用户与组管理——多用户体系

Linux 从设计上就是多用户操作系统。无论是一个开发团队共用一台服务器,还是隔离不同应用的运行权限,用户和组管理都是核心技能。

📋 前置知识:需要先掌握以下内容

1. 你将学到


2. 一个团队共享服务器的故事

(1) 痛点:新同事来了,需要创建账号

小明的团队来了一个新同事 Bob,需要在开发服务器上给他创建账号。在 Windows 上得打开"计算机管理"→"用户和组"→右键新建(还要考虑激活和密码策略)。

(2) Linux 的一行命令

BASH
sudo useradd -m -s /bin/bash bob
sudo passwd bob
# 输入 bob 的密码
sudo usermod -aG developers,sudo bob

三个命令、30 秒、搞定。

(3) 收益:多人协作的基础

创建完用户后,Bob 用 ssh bob@server 登录、有自己的家目录、可以访问共享的 developers 组目录、可以用 sudo 安装软件。


3. 知识点讲解

(1) 用户相关文件

BASH
/etc/passwd    # 用户账户信息
/etc/shadow    # 加密后的密码(仅 root 可读)
/etc/group     # 组信息

/etc/passwd 每行格式(7 个字段,用冒号分隔):

TEXT 📖 仅展示

alice:x:1001:1001:Alice Wang:/home/alice:/bin/bash
└───┘ └ └───┘ └───┘ └───────┘ └─────────┘ └─────────
  │   │   │     │       │           │           └── 登录 Shell
  │   │   │     │       │           └────────────── 家目录
  │   │   │     │       └────────────────────────── 全名/描述
  │   │   │     └────────────────────────────────── 组 ID (GID)
  │   │   └──────────────────────────────────────── 用户 ID (UID)
  │   └──────────────────────────────────────────── 密码占位符(实际加密密码在 shadow)
  └──────────────────────────────────────────────── 用户名

(2) 创建和管理用户

BASH
# 创建用户(带家目录和指定 Shell)
sudo useradd -m -s /bin/bash alice

# 设置密码
sudo passwd alice

> ⚠️ **注意**:新创建的用户如果使用默认密码或弱密码,极易被暴力破解。生产环境中,务必在创建用户后立即要求其修改密码(`chage -d 0 alice` 强制首次登录改密码),并配置密码复杂度策略。

# 删除用户
sudo userdel bob           # 保留家目录
sudo userdel -r bob        # 删除用户及家目录

# 修改用户信息
sudo usermod -l newname alice     # 改用户名

> ℹ️ **说明**:Ubuntu 上还有 `adduser` 命令,它是 `useradd` 的交互式封装——会自动创建家目录、提示设置密码、复制 `/etc/skel` 模板。`useradd` 更灵活但需要手动指定参数,`adduser` 更友好但定制性差。生产脚本中推荐 `useradd`,手动操作可以用 `adduser`。
sudo usermod -d /home/newhome alice  # 改家目录
sudo usermod -L alice              # 锁定用户(禁止登录)
sudo usermod -U alice              # 解锁用户

(3) 创建和管理组

BASH
# 创建组
sudo groupadd developers
sudo groupadd devops

# 删除组
sudo groupdel oldteam

# 将用户添加到组
sudo usermod -aG developers alice    # -aG = append to Group
sudo gpasswd -a bob developers       # 另一种方式

# 从组中移除用户
sudo gpasswd -d bob developers

# 查看用户的组
groups alice
# 输出:alice : alice sudo developers

(4) sudo 提权

sudo 允许普通用户以 root(或指定用户)身份执行命令。

BASH
# 修改 sudoers 配置(永远不要直接编辑 /etc/sudoers)
sudo visudo

> ⚠️ **注意**:永远不要直接用 `vim` 或 `nano` 编辑 `/etc/sudoers` 文件!如果语法出错,会导致 `sudo` 完全失效,你将无法再提权修复。`visudo` 会在保存前自动做语法检查,是唯一安全的编辑方式。

常见配置:

BASH
# 允许 sudo 组所有成员使用 sudo
%sudo ALL=(ALL:ALL) ALL

# 允许特定用户无需密码执行 sudo
alice ALL=(ALL) NOPASSWD: ALL

# 限制只能执行特定命令
bob ALL=(ALL) /usr/bin/apt, /usr/bin/systemctl

▶ 示例:创建用户并配置环境

BASH
# 创建用户 alice
sudo useradd -m -s /bin/bash alice

# 设置密码
sudo passwd alice

# 将 alice 加入 sudo 组(让她可以提权)
sudo usermod -aG sudo alice

# 验证
id alice
# uid=1001(alice) gid=1001(alice) groups=1001(alice),27(sudo)

# 切换到 alice 测试
sudo -u alice whoami
# alice

输出:

TEXT 📖 仅展示
uid=1001(alice) gid=1001(alice) groups=1001(alice),27(sudo)
alice

▶ 示例:创建团队共享组

BASH
# 创建开发组
sudo groupadd developers

# 将团队成员加入开发者组
sudo usermod -aG developers alice
sudo usermod -aG developers bob
sudo usermod -aG developers charlie

# 查看组成员
grep developers /etc/group
# developers:x:1005:alice,bob,charlie

输出:

TEXT 📖 仅展示
developers:x:1005:alice,bob,charlie

▶ 示例:配置 sudo 免密码

BASH
# 用 visudo 编辑(安全方式)
sudo visudo

# 在文件末尾添加(%sudo 行之后):
alice ALL=(ALL) NOPASSWD: ALL

# 或者创建一个独立文件
echo "alice ALL=(ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/alice
sudo chmod 440 /etc/sudoers.d/alice

# 验证
sudo -l -U alice

输出:

TEXT 📖 仅展示
User alice may run the following commands on server:
    (ALL) NOPASSWD: ALL

▶ 示例:查看在线用户

TEXT 📖 仅展示
# 当前登录的用户
who
# alice   pts/0        2026-07-07 09:15 (192.168.1.100)
# bob     pts/1        2026-07-07 10:23 (192.168.1.101)

# 更详细的信息
w
# 10:30:45 up 2 days,  1 user,  load average: 0.08, 0.03, 0.01
# USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU  WHAT
# alice    pts/0    192.168.1.100     09:15    0.00s  0.23s  0.02s w

# 查看最近登录记录
last | head -10

# 当前登录用户数
who | wc -l

输出:

TEXT 📖 仅展示
alice   pts/0        2026-07-07 09:15 (192.168.1.100)
bob     pts/1        2026-07-07 10:23 (192.168.1.101)
 10:30:45 up 2 days,  1 user,  load average: 0.08, 0.03, 0.01
 USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU  WHAT
 alice    pts/0    192.168.1.100     09:15    0.00s  0.23s  0.02s w
alice    pts/0    192.168.1.100     Mon Jul  7 09:15   still logged in
bob      pts/1    192.168.1.101     Mon Jul  7 10:23   still logged in
2

▶ 示例:锁定和解锁用户

BASH
# 锁定用户(账号被锁后将无法登录)
sudo usermod -L bob

# 验证锁定状态
sudo grep bob /etc/shadow
# bob:!$6$...    ← 密码字段前的 ! 表示锁定

# 尝试登录(应该被拒绝)
ssh bob@localhost
# Permission denied

# 解锁用户
sudo usermod -U bob

输出:

TEXT 📖 仅展示
bob:!$6$xyz...:19600:0:99999:7:::
Permission denied, please try again.
bob:$6$abc...:19600:0:99999:7:::

▶ 综合示例:为新开发者配置完整的服务器账号

BASH
#!/bin/bash
# add-dev-user.sh - 为新开发者创建账号

# 检查参数
if [ $# -ne 1 ]; then
    echo "用法: sudo ./add-dev-user.sh <用户名>"
    exit 1
fi

USERNAME=$1

echo "创建用户 $USERNAME..."

# 1. 创建用户
sudo useradd -m -s /bin/bash "$USERNAME"

# 2. 设置密码(需要交互)
sudo passwd "$USERNAME"

# 3. 加入开发组和 sudo 组
sudo usermod -aG developers,sudo "$USERNAME"

# 4. 创建 SSH 目录
sudo mkdir -p /home/$USERNAME/.ssh
sudo chmod 700 /home/$USERNAME/.ssh

# 5. 复制模板配置
sudo cp /etc/skel/.bashrc /home/$USERNAME/
sudo cp /etc/skel/.profile /home/$USERNAME/

# 6. 设置正确权限
sudo chown -R $USERNAME:$USERNAME /home/$USERNAME/

echo "用户 $USERNAME 创建完成!"
echo "请手动运行:sudo passwd $USERNAME 设置密码"

❓ 常见问题

Q: root 用户和普通用户有什么区别? A: \1

Q: 为什么推荐用 sudo 而不是直接登录 root? A: 安全 + 审计:用 sudo 执行的命令有日志(/var/log/auth.log),可以追溯谁在什么时候执行了什么命令。直接登录 root 无法区分操作者。

Q: 删除用户时 userdel -r 会删掉什么? A: 用户的家目录和邮件池(mail spool)。如果不加 -r,家目录会保留——适合需要保留数据的场景(如交接工作)。

Q: /etc/shadow 文件为什么普通用户不能读? A: 因为里面存储了加密后的密码哈希值。虽然哈希值不能直接还原为密码,但攻击者可以用彩虹表暴力破解。所以 shadow 文件权限为 600,仅 root 可读。

Q: 多个用户同时 SSH 会冲突吗? A: 不会。每个 SSH 连接是独立的会话,每个用户有独立的 Shell 进程。但需要注意写同一个文件时可能产生冲突(可以用文件锁解决)。


📖 小节


📝 作业

  1. 基础题(难度⭐):创建一个新用户 student1,设置密码,创建家目录,然后用 whow 查看当前登录用户信息
  2. 进阶题(难度⭐⭐):将 student1 加入 sudo 组并验证可以用 sudo,然后创建一个共享组 team 并将两个用户加入其中
  3. 挑战题(难度⭐⭐⭐):用 sudo -l -U student1 查看该用户的 sudo 权限,然后在 /etc/sudoers.d/ 下创建配置文件限制 student1 只能执行 sudo aptsudo systemctl
Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏