第15章:用户管理基础
20 分钟阅读
第十五章:用户管理基础
想象一下,你的Linux系统是一座摩天大楼,里面住着各种各样的"居民"。有只手遮天的物业老板(root),有负责电梯维护的打工人们(系统用户),还有每天上下班的白领们(普通用户)。这一章,我们就来聊聊这些居民的故事——他们是谁,怎么进来的,怎么管他们。
在Linux的世界里,用户管理可不是闹着玩的。要么你把权限给多了,系统被黑得底裤都不剩;要么你把权限给少了,连自己都登录不进去。所以,且听我细细道来,保证让你听完还想听,笑完还能记住!
15.1 Linux 用户分类
你知道吗?Linux系统里的用户,就像现实世界里的银行卡——卡与卡之间,权限天差地别。有的卡能在银行里横着走(想干嘛干嘛),有的卡连ATM机都吞你钱(处处受限)。Linux也一样,它把用户分成了三六九等,每一等的"待遇"都不一样。
15.1.1 root:UID 0,超级管理员
UID为0的用户,这就是Linux系统里的终极大Boss——root用户,中文名叫"根用户"或"超级管理员"。
root用户有多猛?这么说吧:
- 他能删除系统里任何一个文件,甭管你是系统文件还是你的私人小电影
- 他能修改系统任何一项配置,让Linux从乖巧小绵羊变成狂野大灰狼
- 他能创建和删除任何其他用户,仿佛上帝说"要有光",于是就有了用户
- 他甚至能把自己给删了(别问我为什么要这么干,闲得慌的人什么都做得出来)
UID 是User Identifier的缩写,中文叫"用户标识符",说白了就是系统给每个用户分配的身份证号。root的身份证号是0,所以只要你在系统里看到UID为0的用户,那他就是老大,甭管他叫什么名字——就算他把自己改名叫"小可爱",系统里谁见了都得抖三抖。
温馨提示:root用户虽猛,但也是最危险的。在生产环境中,root直接登录操作就像是在银行金库里裸舞——好看是好看,但万一脚下一滑,后果不堪设想。建议日常使用普通用户,需要权限时再用sudo临时提权。
怎么知道当前用户是不是root?很简单:
| |
看到那个uid=0了吗?这就是root的身份证号。后面那个gid=0是主组ID,我们后面讲组的时候再说。
15.1.2 系统用户:UID 1-999,守护进程
接下来登场的是系统用户,UID范围是1到999(上限取决于发行版的 SYS_UID_MAX 配置:老的 RHEL/CentOS 6 是 1-499,Debian/Ubuntu 和 RHEL 7 以后都是 1-999)。
系统用户是干嘛的?说白了就是给各种系统服务和守护进程打工的。
守护进程是什么?就是那些在后台默默运行的"打工人"进程,比如:
- sshd:让你的电脑能远程登录的打工进程
- httpd/apache2/nginx:网站服务器的打工进程
- mysqld/postgres:数据库的打工进程
- systemd-journald:系统日志的打工进程
这些进程需要一个"身份"来运行,但又不需要它真的能登录系统操作文件(它就是个程序,又不是人),所以就给它们创建了系统用户。
你可以把系统用户理解为公司的"工号账户"——每个工号只能操作特定的工位(进程对应的工作目录和文件),但工号本身是进不了公司大门的(无法登录系统)。
来看一下你的系统里有哪些系统用户:
| |
看到这些名字了吧?daemon是守护进程(daemon这个名字来源于希腊神话中的"daimon",意思是"超自然的存在"),www-data是给网页服务器打工的。
nobody是个例外:它的 UID 是固定的 65534(不在 1-999 里),所以上面那条 awk 命令不会把它筛出来。nobody是"谁都不属于"的幽灵用户,常用来运行不需要任何特权、又怕被滥用的进程(比如某些网络的匿名访问)。类似的还有nogroup(GID 65534)。
15.1.3 普通用户:UID 1000+,日常使用
最后出场的是普通用户,UID从1000或1001开始(取决于系统的UID_MIN和UID_MAX配置)。
普通用户就是你自己——每天坐在电脑前敲代码、写文档、刷视频的这个小可怜。
普通用户的权限有多大?这么说吧:
- ✅ 可以在自己的家目录里为所欲为(家目录就是
/home/用户名) - ✅ 可以运行程序、创建文件、删除自己的文件
- ✅ 可以修改自己的密码
- ❌ 不能修改系统配置
- ❌ 不能访问其他用户的文件(除非对方授权)
- ❌ 不能安装软件到系统目录
- ❌ 不能删除root用户(除非你疯了)
所以普通用户就像是一个高档小区的住户——你可以在自己家里随便造(搞破坏除外),但想动小区的公共设施?对不起,你得找物业(root)。
查看当前系统有多少普通用户:
| |
| |
看到没?uid=1000的小明同学(longx是我的名字,你改成你自己的用户名),他的主组也是1000,但同时加入了sudo组——这意味着他可以临时获得root权限。
📊 Linux 用户分类一览表
pie title Linux 用户分类(数量级示意,非绝对数值)
"root (UID 0):超级管理员" : 1
"系统用户 (UID 1-999):守护进程" : 200
"普通用户 (UID 1000+):真人用户" : 50| 用户类型 | UID范围 | 数量 | 用途 | 能否登录 |
|---|---|---|---|---|
| root | 0 | 唯一 | 系统最高权限 | ✅ 可以(但不建议) |
| 系统用户 | 1-999 | 约200+ | 运行系统服务 | ❌ 通常不能 |
| 普通用户 | 1000+ | 若干 | 人类日常使用 | ✅ 可以 |
🔑 记住这个口诀
UID 0是老板,系统用户是工号,普通用户是住户。
老板能删库跑路,工号只能干活,住户只能在自己家嗨皮。
15.2 UID 和 GID:用户和组的数字标识
上节我们提到了UID,那GID又是什么?它们俩是什么关系?
UID(User Identifier)就是用户的身份证号,GID(Group Identifier)就是用户所属的组身份证号。
组是什么?可以理解为一个"兴趣小组"。比如你喜欢踢球,进了足球小组;我喜欢唱歌,进了合唱团。在Linux里,一个用户可以加入多个组,组内的所有用户可以共享某些文件的访问权限。
- 主组(Primary Group):每个用户必须有且只有一个主组,用户的文件默认属于这个组。就像你的户口本上的户主——你只能有一个户口本,但你可以挂靠多个集体户口。
- 附加组(Supplementary Group):用户可以加入多个附加组,类似于你参加了多个兴趣小组。
来看个例子:
| |
解释一下这个输出:
uid=1000(longx):用户longx的UID是1000,用户名也是longxgid=1000(longx):用户longx的主组GID是1000,组名也是longxgroups=1000(longx),4(adm),24(cdrom),27(sudo)...:用户加入了这些组
为什么GID和UID都是1000?不是巧合,而是默认行为:useradd 默认会为新用户创建一个同名主组(这一行为由 /etc/login.defs 里的 USERGROUPS_ENAB yes 控制),而 GID 和 UID 的最小值、增长方式基本一致,所以新建用户时两者往往相同。你完全可以手动把两者设成不同的值。
| |
也就是说,在默认配置下:
- UID 1000以下是系统用户
- UID 1000-60000是普通用户
- 60000-65533:
useradd默认不会自动分配这一区间,通常留给手动指定的特殊用途(或某些 NFS/容器映射场景)
Debian/Ubuntu 用户请注意:这两个发行版还额外提供了一个更友好的
adduser命令(注意比useradd多一个 d)——它会交互式地提示设置密码、自动创建家目录、自动加上-m -s,适合手工建账号;而useradd是底层命令,适合脚本。可以先用adduser xiaoming体验一下它和useradd的区别。
15.3 useradd 创建用户
终于到了动手环节!创建用户用什么命令?useradd!就像给新员工开账户一样简单。
15.3.1 useradd 用户名 —— 最简单的创建方式
| |
执行完这条命令,系统会:
- 在
/etc/passwd里添加一行xiaoming的信息 - 分配一个UID(通常是1000以上的下一个可用数字)
- 创建一个同名主组(GID = UID)
- 但!不会创建家目录,也不会设置密码
警告:这种最简方式创建的用户,基本就是个"空壳"——没有家目录,登录不了。适合批量创建系统账户,不适合创建真实用户。
15.3.2 useradd -m -s /bin/bash 用户名 —— 完整创建方式
日常使用推荐这种方式:
| |
这下好了,系统会:
- 创建用户xiaoming
- 在
/home下创建/home/xiaoming目录(家目录) - 复制骨架文件到
/home/xiaoming(就是那些.bashrc、.profile之类的配置文件) - 设置登录Shell为bash
创建完成后,别忘了给这个用户设置一个密码:
| |
15.3.3 useradd -u UID 用户名 —— 指定UID创建
有时候你需要指定一个特定的UID(比如要和老系统的用户ID保持一致):
| |
UID 0已经被root占了,所以别想着创建UID 0的用户(除非你想搞事情)。另外,UID 1-999是系统用户专区,强烈建议普通用户使用1000以上的UID。
15.3.4 useradd -g 组名 用户名 —— 指定主组创建
默认情况下,创建用户时会创建一个同名主组。但如果你想让用户加入一个已存在的组作为主组:
| |
15.3.5 useradd 常用选项汇总
| |
| |
15.4 usermod 修改用户
创建用户之后,发现配置错了怎么办?删掉重建?不,聪明人用usermod——这是个"用户信息修改器",专门干改改改的活儿。
15.4.1 usermod -l 新用户名 旧用户名 —— 修改用户名
| |
警告:这个命令只改用户名,不会改家目录名,也不会改其他引用该用户的地方。所以改完之后,家目录还是叫
/home/xiaoming,你可能需要手动改一下:
1 2sudo mv /home/xiaoming /home/xiaohong sudo usermod -d /home/xiaohong xiaohong
15.4.2 usermod -g 组名 用户名 —— 修改用户主组
| |
15.4.3 usermod -aG 组名 用户名 —— 添加用户到附加组
这个是最常用的!假设你的用户想用sudo命令(临时获得root权限),就得把他加到sudo组里:
| |
| |
现在xiaohong可以用sudo了!试试:
| |
15.4.4 usermod -L 用户名 —— 锁定用户
锁定用户,就像把他的账户冻结了——账户还在,但谁也登录不进去:
| |
锁定后会发生什么?用户的密码字段会被加个!前缀,导致密码验证永远失败,但用户文件都还在。
锁定用户比删除用户安全,因为锁定后账户可以随时恢复,删除可就真的没了(除非你有备份)。
15.4.5 usermod 常用选项汇总
| |
15.5 userdel 删除用户
删除用户?userdel命令来帮忙。但删除用户这事儿可不能冲动,冲动是魔鬼,删库跑路可不是开玩笑的。
15.5.1 userdel 用户名 —— 删除用户(保留家目录)
| |
警告:这个命令不会删除家目录!用户没了,但
/home/xiaohong还在,里面可能有重要文件。除非你确认不要了,否则建议保留。
15.5.2 userdel -r 用户名 —— 删除用户(同时删除家目录)
| |
⚠️ 这是不可逆操作!家目录一旦删除,所有文件都没了!建议先备份或者确认清楚再执行。
| |
15.6 passwd 修改密码
创建了用户,当然要设密码!passwd命令就是干这个的——给用户一个身份证明,让系统知道"哦,这是主人,不是闯入者"。
15.6.1 passwd 用户名 —— 普通用户修改自己的密码
| |
15.6.2 passwd -l 用户名 —— 锁定用户(禁用密码登录)
| |
锁定后,用户只能用其他方式登录(比如SSH密钥),但不能用密码登录了。
想把一个人彻底关在门外,光锁密码还不够(他的 SSH 密钥依然能进来)。彻底禁用的组合拳是:
1 2 3sudo usermod -L 用户名 # 锁密码 sudo usermod -s /usr/sbin/nologin 用户名 # 把登录 Shell 换成 nologin sudo chage -E 0 用户名 # 让账户立即过期(0 表示从1970年起就过期)只锁密码(
passwd -l)是一种"软锁定",适合临时停用;三种一起上才是真禁用。
15.6.3 passwd -u 用户名 —— 解锁用户
| |
15.6.4 passwd -d 用户名 —— 删除密码
| |
删除密码后,用户可以直接登录(有些系统可能会禁止无密码登录),这个操作很危险,慎用!
15.6.5 passwd 常用选项汇总
| |
| |
最后那个
-1不是"过期":它是inactive(密码过期后账户被彻底禁用之前的宽限天数),-1表示"不设置,永不因密码过期而禁用账户"。别把它和"账户过期日期"搞混——那个要用chage -E设置、chage -l查看。
15.7 /etc/passwd 文件格式详解
说了这么多创建用户修改密码,你有没有想过——用户信息到底存在哪儿了?
Linux里,用户信息主要存在两个地方:/etc/passwd(用户基本信息)和**/etc/shadow**(密码加密信息)。
先来看/etc/passwd:
| |
输出大概是长这样的:
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
longx:x:1000:1000:LongX,,,:/home/longx:/bin/bash
每行代表一个用户,字段之间用冒号:分隔,共7个字段。
15.7.1 格式:用户名:密码:UID:GID:描述:家目录:Shell
| 字段序号 | 字段名 | 说明 | 示例 |
|---|---|---|---|
| 1 | 用户名 | 登录时使用的名字 | longx |
| 2 | 密码 | 以前存明文密码,现在都是x,表示密码在/etc/shadow里 | x |
| 3 | UID | 用户标识符 | 1000 |
| 4 | GID | 主组标识符 | 1000 |
| 5 | 描述 | 用户的备注信息,可以是姓名、电话等 | LongX,,, |
| 6 | 家目录 | 用户登录后的默认目录 | /home/longx |
| 7 | Shell | 用户登录后使用的命令行解释器 | /bin/bash |
为什么密码字段显示的是x而不是真正的密码?因为真正的密码(加密后的)是存在/etc/shadow文件里的,这个我们后面会讲。
来看个具体例子:
| |
输出:
longx:x:1000:1000:LongX,,,:/home/longx:/bin/bash
字段解析:
longx— 用户名x— 密码占位符(实际密码在/etc/shadow)1000— UID1000— GIDLongX,,,— 描述信息(可以有逗号分隔的多个字段)/home/longx— 家目录/bin/bash— 登录Shell
| |
15.8 /etc/shadow 文件格式详解(密码加密)
如果说/etc/passwd是户口本,那/etc/shadow就是保险柜——存的是用户密码的加密信息。
普通用户没有权限查看shadow文件,只有root才能读:
| |
输出大概是:
root:!$6$somethinghashed:19000:0:99999:7:::
daemon:*:19000:0:99999:7:::
nobody:*:65534:0:99999:7:::
longx:$6$randomsalt$hash:19000:0:99999:7:14::
15.8.1 格式:用户名:加密密码:最后修改:最小:最大:警告:失效:保留:账户过期
每行有9个字段,用冒号分隔:
| 字段序号 | 字段名 | 说明 | 示例 |
|---|---|---|---|
| 1 | 用户名 | 与passwd对应 | longx |
| 2 | 加密密码 | 哈希后的密码,!或*表示锁定 | $6$randomsalt$hash |
| 3 | 最后修改时间 | 上次修改密码的日期(从1970-01-01算起的天数) | 19000 |
| 4 | 最小天数 | 密码修改后至少多少天才能再改 | 0 |
| 5 | 最大天数 | 密码最多能用多少天 | 99999 |
| 6 | 警告天数 | 密码快过期前多少天开始警告 | 7 |
| 7 | 失效天数(inactive) | 密码已过期,但账户再宽限多少天才会被禁用 | 空 |
| 8 | 保留字段 | 预留的,目前没用 | 空 |
| 9 | 账户过期日 | 账户到这一天就作废(从1970-01-01算起的天数),空表示永不过期 | 空 |
第 7 和第 9 个字段最容易记混:第 7 个是"密码过期后仍然放过你几天",第 9 个是"这个账号本身到哪天作废"(相当于
chage -E)。两个都空着表示"不管"。
15.8.2 密码字段:! 表示锁定
| |
为什么现在不用 MD5/SHA 而用 yescrypt? MD5、SHA-256、SHA-512 都是"快"哈希,显卡每秒能算几十亿次,适合拿字典硬碰。yescrypt、bcrypt 是"慢"哈希,还能按需调高计算成本,破解成本高得多。查看自己的系统默认用什么算法:
grep ^ENCRYPT_METHOD /etc/login.defs(现代系统一般是YESCRYPT)。
| |
| |
/etc/shadow 文件包含加密的密码信息,绝对不能让普通用户读取!如果普通用户能读 shadow 文件,就可以把哈希拿去离线爆破。所以这个文件权限非常严格——不同发行版的默认值不完全一样:
| |
别照抄"000 才是对的":Debian 系给 shadow 组留了读权限是为了让 chage、passwd -S 这类工具正常工作,是设计如此。判断标准只有一条:普通用户的 UID 不能读到它。可以用 sudo -u 某个普通用户 cat /etc/shadow 测一下(预期报 Permission denied)。
15.9 id 查看用户信息
想知道某个用户的UID、GID和所属组?id命令是你最好的朋友。
15.9.1 id 用户名 —— 查看指定用户信息
| |
15.9.2 id —— 查看当前用户信息
| |
| |
| |
| |
15.10 whoami、who、w、users 查看登录用户
想知道现在谁登录在系统里?这几个命令可以帮你"点名"。
15.10.1 whoami:当前用户名
最简单的一个——就是显示你当前的用户名:
| |
等同于:
| |
15.10.2 who:当前登录用户
who命令比whoami强大一点,能显示所有当前登录的用户:
| |
| 字段 | 说明 |
|---|---|
| longx | 用户名 |
| pts/0 | 终端设备名(pts是伪终端,0是编号) |
| 2026-03-23 12:00 | 登录时间 |
| 192.168.1.100 | 登录来源IP(如果是本地则是时间) |
| |
15.10.3 w:详细信息
w命令是who的升级版,不仅显示谁登录了,还显示他们在干什么:
| |
第一行是系统负载信息:
up 3 days:系统运行了3天2 users:2个用户登录load average: 0.15, 0.10, 0.05:1分钟、5分钟、15分钟的平均负载
其他列:
USER:用户名TTY:终端FROM:登录来源IDLE:空闲时间WHAT:正在运行的命令
| |
15.10.4 users:简洁的用户列表
| |
就显示登录的用户名,简单粗暴。
📊 登录查看命令对比
graph LR
A["whoami"] --> B["我是谁?<br/>只显示当前用户"]
C["who"] --> D["谁在?<br/>显示所有登录用户"]
E["w"] --> F["谁在干嘛?<br/>显示用户及活动"]
G["users"] --> H["谁?<br/>简洁列表"]
style A fill:#e1f5fe
style C fill:#fff3e0
style E fill:#f3e5f5
style G fill:#e8f5e9本章小结
本章我们学习了Linux用户管理的基础知识:
🔑 核心知识点
Linux用户分类:
- root用户(UID 0):系统最高权限,相当于皇帝
- 系统用户(UID 1-999):运行系统服务和守护进程,不能登录
- 普通用户(UID 1000+):人类用户,权限受限
UID和GID:
- UID是用户的身份证号,唯一标识每个用户
- GID是组的身份证号,每个用户有一个主组,可以有多个附加组
用户管理命令:
useradd:创建用户(推荐加-m -s /bin/bash)usermod:修改用户信息(-l改名字,-aG加组,-L锁定)userdel:删除用户(-r同时删家目录)passwd:管理密码(-l锁定,-u解锁,-d删密码)
重要配置文件:
/etc/passwd:用户基本信息(7个字段)/etc/shadow:密码加密信息(9个字段)- 查这些信息优先用
getent passwd 用户名/getent group 组名,它会按系统真正的解析顺序(含 LDAP/SSSD)查,比直接grep /etc/passwd更可靠
登录查看命令:
whoami:我是谁who:谁在登录w:谁在登录以及在干嘛id:查看用户的UID/GID/组信息
安全提醒:
- 锁定用户光靠
passwd -l不够,SSH 密钥仍可登录;要配合nologin+chage -E 0 - 删除用户用
userdel -r会连家目录一起删,动手前务必确认或先备份
- 锁定用户光靠
💡 记住这个原则
root用得越多,死的越快。 日常操作用普通用户,需要权限时用sudo临时提权,这才是正确的Linux打开方式。