Linux 常用命令学习笔记(用户管理篇):用户、组与权限的钥匙


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 表示禁止登录

你会注意到文件里有一大堆系统账户 (如 daemonwww-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 个或多个。用来获取额外权限 ,比如加入 sudodocker 组。它不影响新建文件的默认属组。

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 与 sudosudo 临时提权最安全;su 切用户有常驻 root 的风险;sudoersvisudo 改;

  • 三本账/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

回看整个系列:基础篇 摸单兵命令(whoamicatls)→ 进阶篇 用管道和文本工具批量处理 → 高级篇 用正则 + Vim/Emacs 精修文件 → 本篇 搞清「谁在操作、有哪些组、权限主体是谁」。四篇连起来,Linux 命令行的能力版图才真正完整。

如果在练手时想有个能随手敲命令的环境,基础篇、进阶篇、高级篇都推荐过的 Linux Journey(https://labex.io/linuxjourney 同样适合本篇:网页里就能实操 useradd、翻 /etc/passwd,边学边练印象最深。

用户管理先聊到这,下一篇正式进入「权限管理」 :看懂 rwx 那一串,学会用 chmod / chown / chgrp 给文件分配读写执行权限。关注本博客,我们进阶路上见~

相关推荐
He BianGu1 小时前
【笔记】使用Assembly.LoadFrom和AssemblyLoadContext加载插件对比,以及有没有更合适的加载插件方案
笔记
hhwyqwqhhwy1 小时前
正点原子-ZYNQ7020 开发笔记
笔记
不可求~1 小时前
C++ 报错交给 AI 之前,先准备好这 8 类信息
开发语言·c++·人工智能
LuminousCPP1 小时前
栈和队列专题(四):LeetCode 232. 用栈实现队列|双栈分工 + 按需迁移 + 摊还 O(1)
c语言·数据结构·笔记·算法·leetcode
名字还没想好☜1 小时前
用 Python struct 解析二进制协议:pack/unpack、字节序与对齐踩坑
开发语言·python·二进制·struct
刚入门的大一新生1 小时前
Linux-Linux的进程状态
linux·运维·服务器
Zkaisen1 小时前
mtreoCVE-2025-11953学习(目录遍历与远程命令执行)
学习·react native·react.js·metro
GGMM7891 小时前
富士 EP‑3957E‑C4 电源驱动板维修实战笔记
笔记·变频器·变频器维修
小淮AI1 小时前
外籍子女在华读书,中文“听得懂”和“学得深”之间差几步?
学习