第 8 章 · 06 用户与组: 、 、 本节摘要:Linux 是多用户系统——每个能登录的人是一个「用户」,用户归入「组」,权限按「用户/组/其他」三级分配(呼应第 5 章)。本节讲用户管理的完整闭环:用 建用户(讲清 建家目录、 指定 shell 的关键选项)、用 设密码、用 改属性(如 加入组)、用 删用户连同家目录。还要讲清 / / 三个核心配置文件各自存什么。 内容来源:综合用户管理知识整理,套用体系化模板。 学习目标 阅读完本节,你应当能够: 用 建一个带家目录、指定 shell 的新用户。 用 给用户设密码。 用 把用户加入组(追加,不覆盖)。 用 删除用户连同家目录。 说清 (用户基本信息)、 (密码哈希)、 (组)各自存什么。 理解「主组」与「附加组」的差别。
useradd、passwd、usermod本节摘要:Linux 是多用户系统——每个能登录的人是一个「用户」,用户归入「组」,权限按「用户/组/其他」三级分配(呼应第 5 章)。本节讲用户管理的完整闭环:用
useradd建用户(讲清-m建家目录、-s指定 shell 的关键选项)、用passwd设密码、用usermod改属性(如-aG加入组)、用userdel -r删用户连同家目录。还要讲清/etc/passwd//etc/shadow//etc/group三个核心配置文件各自存什么。
内容来源:综合用户管理知识整理,套用体系化模板。
阅读完本节,你应当能够:
useradd -m -s /bin/bash 用户名 建一个带家目录、指定 shell 的新用户。passwd 用户名 给用户设密码。usermod -aG 组名 用户名 把用户加入组(追加,不覆盖)。userdel -r 用户名 删除用户连同家目录。/etc/passwd(用户基本信息)、/etc/shadow(密码哈希)、/etc/group(组)各自存什么。Linux 的多用户模型由几个概念构成:
docker 组的成员能不 sudo 用 docker)。有 GID、组名。/home/用户名,用户对自己的家目录有完全权限。/bin/bash)。设为 /sbin/nologin 则禁止登录(服务账号常用)。每个用户有一个主组(primary group,通常与用户名同名,创建时自动建),还可属于多个附加组(supplementary groups,用 -aG 加入)。权限检查时(第 5 章),系统先看属主、再看主组与附加组、最后看其他。
sudo useradd -m -s /bin/bash alice # -m: 创建家目录 /home/alice(不加 -m 则无家目录, 后续登录会报错) # -s: 指定登录 shell 为 bash(不加 -s 在某些发行版默认是 sh, 不友好)
⚠️ 注意:
useradd不带-m不建家目录,不带-s可能默认 sh——这是新手常踩的坑。养成习惯useradd -m -s /bin/bash一起加。或者用更友好的adduser(Debian/Ubuntu 系有,交互式问你所有信息)。
sudo passwd alice # 给 alice 设密码(会提示输入两次) passwd # 不带参数 = 改自己的密码
没有密码的用户,某些认证方式(如 SSH 密码登录)无法登录。但服务账号(跑服务的用户)通常故意不设密码、shell 设 nologin,防止被人登录。
sudo usermod -aG docker alice # 把 alice 加入 docker 组(附加组) sudo usermod -aG sudo alice # 加入 sudo 组(可执行 sudo, Ubuntu/Debian) sudo usermod -s /bin/zsh alice # 改默认 shell 为 zsh sudo usermod -L alice # 锁定账号(禁用密码登录) sudo usermod -U alice # 解锁
⚠️ 注意:
-aG的-a(append)绝不能漏!只写-G docker会把用户从其他所有附加组移除(覆盖),只留 docker 组——这是灾难性的常见错误。永远写-aG。
sudo userdel alice # 删用户, 但保留家目录(以防有数据) sudo userdel -r alice # -r: 连家目录一起删(确认无数据再用)
id alice # 查 alice 的 UID/GID/所属组 groups alice # 查 alice 在哪些组 whoami # 当前我是谁 who # 当前谁登录了
用户与组的信息存在三个文本文件里,理解它们有助于排查:
alice:x:1001:1001:Alice:/home/alice:/bin/bash 用户名:密码占位:UID:GID:描述:家目录:shell
x 表示密码不存这里(存 shadow)。每行一个用户。能用 grep alice /etc/passwd 查。
alice:$6$xxx...hashed...:19000:0:99999:7:::
存密码哈希(只有 root 能读,安全)。密码策略(过期天数等)也在这。
docker:x:998:alice,bob 组名:密码占位:GID:成员列表
成员列表列附加组成员(主组成员不在这列)。
sudo useradd bob # 没建家目录 su - bob # 报错: "No directory, logging in with HOME=/"
修复:sudo mkdir /home/bob && sudo chown bob:bob /home/bob,或干脆 userdel bob 重建时加 -m。
sudo usermod -G docker alice # 灾难! alice 从 sudo 组被移除了! sudo usermod -aG docker alice # 对! -a 追加, 不影响其他组
永远写 -aG 而非 -G。如果不慎写错,从 /etc/group 查用户原来在哪些组,重新加回。
sudo usermod -aG docker alice # alice 需要重新登录, 新的组成员身份才生效
组成员身份在登录时读入,加入组后当前已登录的会话不更新,需重新登录(或 newgrp docker 临时切到新组)。
sudo userdel -r alice # 报错: "user alice is currently used by process 1234"
先停掉该用户运行的进程(pkill -u alice),再 userdel。
useradd -m -s /bin/bash 名(-m 建家目录、-s 指定 shell,缺一不可);或用交互式的 adduser(Debian/Ubuntu)。passwd 用户;服务账号常不设密码、shell 设 nologin 防登录。usermod -aG 组 用户(加组,永远写 -aG 别写 -G)、-s 改 shell、-L/-U 锁定/解锁。userdel -r 用户(连同家目录,确认无数据)。/etc/passwd(基本信息,UID/GID/家目录/shell)、/etc/shadow(密码哈希,仅 root 可读)、/etc/group(组与成员)。newgrp 临时切组)。下一节讲 sudo——为什么它是「受限提权」而非「直接给 root」,以及它的安全模型。