Linux: 用户与组管理——多用户体系
Linux 从设计上就是多用户操作系统。无论是一个开发团队共用一台服务器,还是隔离不同应用的运行权限,用户和组管理都是核心技能。
📋 前置知识:需要先掌握以下内容
- 第8课:文件权限
1. 你将学到
- useradd 和 adduser 的区别
- passwd 管理密码
- groupadd 和 usermod 管理组
- sudo 提权配置
- 查看登录用户信息
2. 一个团队共享服务器的故事
(1) 痛点:新同事来了,需要创建账号
小明的团队来了一个新同事 Bob,需要在开发服务器上给他创建账号。在 Windows 上得打开"计算机管理"→"用户和组"→右键新建(还要考虑激活和密码策略)。
(2) Linux 的一行命令
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) 用户相关文件
/etc/passwd # 用户账户信息
/etc/shadow # 加密后的密码(仅 root 可读)
/etc/group # 组信息
/etc/passwd 每行格式(7 个字段,用冒号分隔):
alice:x:1001:1001:Alice Wang:/home/alice:/bin/bash
└───┘ └ └───┘ └───┘ └───────┘ └─────────┘ └─────────
│ │ │ │ │ │ └── 登录 Shell
│ │ │ │ │ └────────────── 家目录
│ │ │ │ └────────────────────────── 全名/描述
│ │ │ └────────────────────────────────── 组 ID (GID)
│ │ └──────────────────────────────────────── 用户 ID (UID)
│ └──────────────────────────────────────────── 密码占位符(实际加密密码在 shadow)
└──────────────────────────────────────────────── 用户名
(2) 创建和管理用户
# 创建用户(带家目录和指定 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) 创建和管理组
# 创建组
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(或指定用户)身份执行命令。
# 修改 sudoers 配置(永远不要直接编辑 /etc/sudoers)
sudo visudo
> ⚠️ **注意**:永远不要直接用 `vim` 或 `nano` 编辑 `/etc/sudoers` 文件!如果语法出错,会导致 `sudo` 完全失效,你将无法再提权修复。`visudo` 会在保存前自动做语法检查,是唯一安全的编辑方式。
常见配置:
# 允许 sudo 组所有成员使用 sudo
%sudo ALL=(ALL:ALL) ALL
# 允许特定用户无需密码执行 sudo
alice ALL=(ALL) NOPASSWD: ALL
# 限制只能执行特定命令
bob ALL=(ALL) /usr/bin/apt, /usr/bin/systemctl
▶ 示例:创建用户并配置环境
# 创建用户 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
▶ 示例:创建团队共享组
# 创建开发组
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 免密码
# 用 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
▶ 示例:查看在线用户
# 当前登录的用户
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
▶ 示例:锁定和解锁用户
# 锁定用户(账号被锁后将无法登录)
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:::
▶ 综合示例:为新开发者配置完整的服务器账号
#!/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 进程。但需要注意写同一个文件时可能产生冲突(可以用文件锁解决)。
📖 小节
useradd -m -s /bin/bash创建新用户,passwd设置密码groupadd创建组,usermod -aG将用户加入组sudo visudo安全编辑 sudo 配置,%group设置组级别权限/etc/passwd用户信息、/etc/shadow密码、/etc/group组信息who/w/last查看登录用户
📝 作业
- 基础题(难度⭐):创建一个新用户
student1,设置密码,创建家目录,然后用who和w查看当前登录用户信息 - 进阶题(难度⭐⭐):将
student1加入sudo组并验证可以用sudo,然后创建一个共享组team并将两个用户加入其中 - 挑战题(难度⭐⭐⭐):用
sudo -l -U student1查看该用户的 sudo 权限,然后在/etc/sudoers.d/下创建配置文件限制student1只能执行sudo apt和sudo systemctl