在 Linux 常用命令学习笔记(高级篇) 里,我们把文本处理这条线推到了深水区:用正则给
grep装上瞄准镜,再请出 Vim / Emacs 让你能直接在终端里改文件。但那篇结尾我打了个包票:下一篇正式进入「用户和管理」。今天就来兑现。你可能会想:我天天
sudo apt install敲得飞起,还要专门学用户管理?答案是------只要你在用 Linux,你就活在一个多用户、权限隔离的世界里 。为什么cat /etc/shadow会被拒绝?为什么sudo之后就能看?useradd一声令下,系统悄悄改了哪几个文件?这篇一次讲清。学完你会发现:所谓权限,底层就是用户 + 组 + 文件属主属组 三个东西在博弈。先把用户和组搞明白,下一篇讲
chmod/chown才会顺理成章。
前情回顾:本篇要「接」上哪些旧工具
| 之前学过的 | 本篇怎么接上它 |
|---|---|
whoami(基础篇) |
它只告诉你「我是谁」;本篇讲清楚「我是哪个 UID 、属于哪个组 、为什么 root 的 UID 永远是 0」 |
cat / less / ls -la(基础、进阶) |
本篇用它们翻 /etc/passwd、/etc/shadow、/etc/group,并用 ls -la 看文件的属主与属组 |
grep(进阶、高级) |
本篇用它从几百号用户里精准捞出某人:grep '^bob:' /etc/passwd |
| Vim / Emacs(高级篇) | 本篇郑重提醒:改用户文件千万别 手贱用 Vim 直接改 /etc/passwd,要用 useradd / usermod 这类专用命令 |
记住一个核心心法:用户和组是「权限的主体」,文件属主属组是「权限的客体」。Linux 先把主体认清楚,才谈得上给客体分配权限。
一、为什么要有用户和组
在任何多用户操作系统里,管理用户和组都是基础概念,Linux 尤其把这事做成了访问控制和权限管理的核心。
-
每个用户有独立主目录 ,通常在
/home/用户名,用来存你自己的文件和配置(不同发行版路径可能略有差异)。 -
系统靠数字认人 :用户名只是给人看的可读标签,真正干活的是 UID(用户 ID) 和 GID(组 ID)。所有权限判断都基于这两个数字。
-
组是用户的集合:把一堆人归到一个组,就能一次性给这一组人授权,不用一个个配。
-
进程也分身份:你跑起来的进程,是以「启动它的那个用户」的身份在运行;文件访问同样按权限,防止 A 用户翻看 B 用户的私货。
在这个层级的最顶端,站着一个凌驾于所有人之上的人:root,也就是超级用户 。它的 UID 永远为 0,拥有无限权限------能读任何文件、管任何进程。但一直用 root 操作很危险 :一个手滑就可能把系统搞崩。所以 Linux 的设计哲学是:平时用普通用户,需要时用 sudo 临时提权。
小实验:试着看一眼存着加密密码的文件:
cat /etc/shadow # 报错:Permission denied(权限拒绝) ls -la /etc/shadow # -rw-r----- 1 root shadow 847 Jun 30 22:48 /etc/shadow # 只有 root 用户和 shadow 组的成员能读 sudo cat /etc/shadow # 输入密码后,内容就显示出来了这个「被拒绝 → 加 sudo → 放行」的过程,正是用户与权限管理最直观的体现了。
二、root 与 sudo:提权要有节制
2.1 sudo:临时以 root 身份跑单条命令
sudo(superuser do)让你不用登录 root 账户,就能以超级用户身份执行某一条命令。这是日常管理的首选方式:
sudo cat /etc/shadow # 以 root 权限查看受保护文件
sudo apt update # 以 root 权限更新软件源
系统会提示你输入当前用户的密码,认证通过后才放行。
2.2 su:切换用户(含切到 root)
除了 sudo,你还能用 su(substitute user,切换用户)来获取别的身份。不带用户名时,它默认切到 root:
su # 开启一个 root 的 shell,要输入 root 密码
su bob # 切到用户 bob,要输入 bob 的密码
2.3 为什么不建议常驻 root shell
用 su 打开一个 root shell 看起来很爽,但隐患不小:
-
持续以 root 操作,犯系统级错误的风险陡增;
-
root shell 里的操作不会记在你个人用户名下,出事后很难审计「是谁改的」。
所以最佳实践明确:需要超级权限的单条命令,用 sudo;别长期泡在 root shell 里。
2.4 sudoers 文件:谁能 sudo 由它说了算
系统怎么决定「你能不能用 sudo」?答案在 /etc/sudoers 这个配置文件里------它列出了被授权以超级用户身份运行命令的用户和组。
永远用 visudo 来编辑它,而不是拿 Vim 直接改:
sudo visudo
visudo 会在保存前做语法检查,能防止你把配置写错、结果把自己锁在 sudo 权限之外(那种「改完 sudoers 然后 sudo 用不了」的惨剧,八成就是手改惹的祸)。
三、三个核心文件
Linux 把用户、组的信息分散在几个纯文本文件里,像三本账本。理解它们的字段,用户管理就通透了。
3.1 /etc/passwd:用户信息总表(7 个字段)
cat /etc/passwd
# root:x:0:0:root:/root:/bin/bash
# 1 2 3 4 5 6 7
每一行代表一个用户,7 个字段用冒号 : 隔开:
| 字段 | 含义 | 说明 |
|---|---|---|
| 1 用户名 | 登录名 | 如 root |
| 2 密码 | 占位符 | x 表示真密码在 /etc/shadow;* 表示账户被锁、不能登录;空白表示无密码 |
| 3 UID | 用户 ID | root 永远是 0;普通用户从 1000 起 |
| 4 GID | 主组 ID | 用户主组的数字标识 |
| 5 GECOS | 注释 | 传统存放全名、电话、办公室等,逗号分隔 |
| 6 主目录 | 家目录绝对路径 | 如 /root、/home/bob |
| 7 Shell | 默认登录 shell | 如 /bin/bash;/sbin/nologin 表示禁止登录 |
你会注意到文件里有一大堆系统账户 (如 daemon、www-data),它们不是给人登录用的,而是以低权限跑特定服务/进程,专门用来增强系统安全性。
⚠️ 编辑警告:技术上你可以用 Vim 或
vipw直接改/etc/passwd,但强烈不建议 。手改极易引入语法错误,可能把自己锁在系统外。请用下面要讲的useradd/usermod/userdel专用命令。
3.2 /etc/shadow:密码保险柜(9 个字段)
/etc/shadow 存的是加密密码和密码老化策略 。它和全局可读的 /etc/passwd 分开,而且必须 sudo 才能看------这样非特权用户连密码哈希都摸不到,更别提拿去离线破解。
sudo cat /etc/shadow
# root:MyEPTEa$6Nonsense:15000:0:99999:7:::
每行 9 个字段,仍以冒号分隔:
| 字段 | 含义 |
|---|---|
| 1 用户名 | 登录名 |
| 2 加密密码 | 哈希后的密码;* 或 ! 表示账户被锁 |
| 3 最后改密日期 | 距 1970-01-01 的天数;0 表示下次登录强制改密 |
| 4 最小密码年龄 | 改密后必须等多久才能再改 |
| 5 最大密码年龄 | 密码有效的最大天数,过期必须改 |
| 6 密码警告期 | 过期前几天开始提醒 |
| 7 不活跃期 | 过期后账户被禁用前的宽限天数 |
| 8 账户过期日 | 绝对过期日期(同样按 1970 起算天数) |
| 9 保留字段 | 留作未来扩展 |
现代发行版还会叠加 PAM(可插拔认证模块)等更灵活的认证机制,但
/etc/shadow的基础地位不动摇。
3.3 /etc/group:组信息表(4 个字段)
cat /etc/group
# root:*:0:pete
每行一个组,4 个字段:
| 字段 | 含义 |
|---|---|
| 1 组名 | 组的唯一名称 |
| 2 组密码 | 遗留功能,几乎不用;通常 * 或 x 占位 |
| 3 GID | 组的数字 ID |
| 4 成员列表 | 属于该组的用户名,逗号分隔 |
示例:
root:*:0:pete 表示:组名 root、无密码、GID 0、成员里有用户 pete。
四、用户管理三板斧:useradd / usermod / userdel
理论讲完,上实操。管理用户有专用命令,比手改文件安全可靠得多。
4.1 添加用户:useradd
sudo useradd [选项] 用户名
常用选项(日常几乎必加 -m 和 -s):
| 参数 | 作用 | 实例 |
|---|---|---|
-m |
自动创建家目录 /home/用户名 |
sudo useradd -m -s /bin/bash bob |
-s /bin/bash |
指定登录 shell;/sbin/nologin 禁止登录 |
sudo useradd -m -s /bin/bash bob |
-u UID |
指定用户 UID | sudo useradd -m -u 1200 myuser |
-g 组/GID |
指定主组(初始登录组) | sudo useradd -m -u 1200 -g 1001 myuser |
-G 组1,组2 |
指定附属组,逗号隔开 | sudo useradd -m -s /bin/bash testuser -G sudo |
-c "备注" |
写入 /etc/passwd 第 5 字段(GECOS) |
sudo useradd -m -c "Bob Lee" bob |
-d /path |
手动指定家目录路径 | sudo useradd -m -d /data/bob bob |
-e YYYY-MM-DD |
设置账号过期时间 | sudo useradd -m -e 2026-12-31 bob |
-M |
不创建家目录(服务账号常用) | sudo useradd -M -s /sbin/nologin appuser |
一条综合示例:
sudo useradd -m -s /bin/bash -u 1200 -g 1001 -G sudo testuser
# -m 建家目录 -s 用 bash -u 指定 UID -g 主组 1001 -G 追加 sudo 附属组
useradd是低级标准工具;部分发行版还提供交互性更好的adduser脚本,但useradd是通用写法。
4.2 删除用户:userdel
sudo userdel 用户名 # 删用户,保留家目录
sudo userdel -r 用户名 # -r:连家目录一起删(彻底删除)
4.3 改密码:passwd
passwd # 普通用户改自己的密码
sudo passwd bob # root 改别人密码,不用输入旧密码
五、组管理:主组 vs 附属组(最容易混淆)
Linux 里每个用户一定属于:1 个主组(初始组) + 0 到多个附属组(附加组)。
/etc/passwd第 4 字段的 GID → 对应用户的主组 ID/etc/group存所有组信息;/etc/gshadow存组密码(很少用)
5.1 主组与附属组的区别
-
主组(primary group,
-g) :每个用户有且只有一个 。用户新建文件/目录时,文件的默认属组就是主组。创建用户时默认会生成一个同名私有组 (如user:x:1001:1001::/home/user:/bin/bash,GID=1001 就是同名私有组)。 -
附属组(supplementary group,
-G) :可以有 0 个或多个。用来获取额外权限 ,比如加入sudo、docker组。它不影响新建文件的默认属组。
5.2 查看用户所属组
groups # 当前登录用户的所有组
groups 用户名 # 查看指定用户的所有组
id 用户名 # 输出 UID、主组 GID、以及全部附属 GID
示例输出:
id user1
# uid=1000(user1) gid=1000(user1) 组=1000(user1),27(sudo)
# gid=1000 → 主组;逗号后面的是附属组(这里 user1 还属于 sudo 组)
5.3 创建 / 删除组
groupadd webgrp # 创建组 webgrp,自动分配 GID
groupadd -g 2000 webgrp # 指定 GID 创建
groupdel webgrp # 删除组
# 注意:不能删除某个用户的「主组」,要先改掉该用户的主组才能删
5.4 修改用户组:usermod
# -g 修改主组
usermod -g webgrp user1
# -G 设置附属组(不带 -a 会直接覆盖全部原有附属组!)
usermod -G sudo,docker user1
# -aG 追加附属组(保留原有附属组,最常用、最安全)
usermod -aG docker user1
💥 大坑 :
usermod -G docker user1如果忘了加-a,会把 user1 从sudo等其他附属组里一脚踢出去 !要追加永远用-aG。
六、文件属主与属组
文件有两个关键属性:属主(哪个用户) 和 属组(哪个组)。
ls -la
# -rw-r--r-- 1 user1 webgrp 123 test.txt
# 属主:user1 属组:webgrp
几条关键规律:
-
用户新建文件时,文件默认属组 = 当前用户的主组;
-
如果用户只是某个组的附属组成员 ,新建文件的属组不变(还是主组),只是该用户拥有这个组对应的权限。
这正好引出下一篇的核心问题:那一串 -rw-r--r-- 到底是什么意思?怎么用 chmod 改读写执行权限、用 chown / chgrp 改属主属组?------也就是我们常说的「文件权限管理」。
小结
这一篇,我们把「用户和管理」这根线立了起来:
-
为什么要有用户和组:多用户、权限隔离的世界,靠 UID / GID 认人,root(UID=0)是顶端但别常驻;
-
root 与 sudo :
sudo临时提权最安全;su切用户有常驻 root 的风险;sudoers用visudo改; -
三本账 :
/etc/passwd(7 字段)、/etc/shadow(9 字段,密码保险柜)、/etc/group(4 字段); -
用户三板斧 :
useradd(-m -s -u -g -G 等)、userdel(-r 连家目录)、passwd; -
组管理 :主组 vs 附属组------
groups/id查看,groupadd/groupdel增删,usermod -aG追加(别漏-a); -
文件属主属组 :新建文件默认属组=主组,这正好接上下一篇的
chmod/chown。
回看整个系列:基础篇 摸单兵命令(whoami、cat、ls)→ 进阶篇 用管道和文本工具批量处理 → 高级篇 用正则 + Vim/Emacs 精修文件 → 本篇 搞清「谁在操作、有哪些组、权限主体是谁」。四篇连起来,Linux 命令行的能力版图才真正完整。
如果在练手时想有个能随手敲命令的环境,基础篇、进阶篇、高级篇都推荐过的 Linux Journey(https://labex.io/linuxjourney) 同样适合本篇:网页里就能实操 useradd、翻 /etc/passwd,边学边练印象最深。
用户管理先聊到这,下一篇正式进入「权限管理」 :看懂 rwx 那一串,学会用 chmod / chown / chgrp 给文件分配读写执行权限。关注本博客,我们进阶路上见~