Day 05(上):Linux 的“门禁系统“——用户、组与密码管理

📅 2026/7/19 3:56:33 👁️ 阅读次数 📝 编程学习
Day 05(上):Linux 的“门禁系统“——用户、组与密码管理

Linux 命令行日课· 从零到得心应手的每日修行

Day 01:别再被命令行劝退了——Day 01:终端、提示符与文本查看命令
Day 02:文件管理命令——创建、复制、移动、删除与链接
Day 03:求助、编辑与重定向——让 Linux 真正为你工作
Day 04:你的终端其实会"编程"——变量、环境与引号的艺术
Day 05(上):Linux 的"门禁系统"——用户、组与密码管理(本篇)
Day 05(下):即将更新


这是"Linux 命令行日课"系列的第五篇。前面四天,我们一直在以一个"使用者"的身份敲命令——创建文件、编辑文本、查看帮助。但你有没有想过一个问题:凭什么你能做这些事?系统又是怎么知道"你是谁"的?

答案藏在三个文件里:/etc/passwd/etc/group/etc/shadow。你没看错,Linux 的用户体系本质上就是三个文本文件。但别被"文本文件"这种简单的说法骗了——这里面装着整个系统的安保逻辑。

今天上半篇,我们把用户、组、密码这三个板块一次性打通。学完之后,你就能回答那个最根本的问题:Linux 怎么记住一个人,又怎么判断这个人能做什么。


一、认识用户——Linux 世界的"身份证"

1.1 你敲的每一条命令,背后都有一个"身份"

在 Linux 里,任何东西都有归属。每个进程(运行中的程序)以某个用户的身份运行,每个文件有一个用户作为它的所有者。这不是装饰——系统就是靠这套归属关系决定"谁能动什么"。

用户用用户名(username)来标识,方便人类记忆。但在系统内部,真正区分你和其他人的是一串数字——UID(User ID)。用户名就像你的名字,UID 是你的身份证号。系统认号不认名。

Linux 的用户分为三种角色,每种角色的设计目的一目了然:

类型用户名UID能干什么特征
超级用户root0一切——没有限制管理系统的唯一账号
系统用户如 postfix、sshd201-999只运行自己的服务不能登录,保护服务进程的文件
普通用户你创建的所有1000 起自己的文件 + 被授权的资源日常使用,权限受限

关键认知:UID 为 0 就是 root 权限。这意味着——即使你叫zyf,只要 UID 是 0,系统就当你 root。后面密码管理部分你会看到这个知识有多"危险"。


1.2/etc/passwd——系统的人口登记簿

Linux 把你认识的每一个"人"都登记在/etc/passwd里。一行一个人,七个字段,冒号分隔:

name:password:UID:GID:GECOS:directory:shell

拿一行真实的记录拆开看:

zyf:x:1000:1000:software admin:/home/zyf:/bin/bash
字段含义这一行的值通俗解释
name登录名zyf你登录时敲的用户名
password密码x不存这里,密码加密存在/etc/shadow
UID用户 ID1000系统内部用这串数字认人
GID主组ID1000你属于哪个主要组
GECOS描述信息software admin注释栏,可以写真实姓名/部门
directory家目录/home/zyf登录后默认呆的地方
shell登录 shell/bin/bash登录后跑什么程序来跟你交互

注意一点:系统用户的 shell 通常是/sbin/nologin。这不是一个真正的 shell,而是一把"锁"——告诉系统"这个账号不是用来登录的"。比如postfix用户:

[zyf@centos7 ~]$greppostfix /etc/passwd postfix:x:89:89::/var/spool/postfix:/sbin/nologin

1.3/etc/group——组是用户的"团队"

组的概念不难理解:一个组就是一个团队,加入团队就继承团队的权限。和用户一样,组有名字(人类看的)和 GID(系统认的)。

/etc/group一行一个组,四个字段:

group_name:password:GID:user_list
[zyf@centos7 ~]$grepwheel /etc/group wheel:x:10:zyf

字段含义解释
group_name组名wheel——管理员组
password组密码x 表示密码在别处,基本用不到
GID组 ID10
user_list补充成员zyf是这个组的补充成员

1.4 主要组 vs 补充组——你必须搞清的"一对多"关系

每个用户只有一个主要组(primary group),定义在/etc/passwd的 GID 字段。默认情况下,用户新建的文件,组所有者就是这个主要组。

但用户还可以有多个补充组(supplementary groups),定义在/etc/group的 user_list 里。

id命令一眼看穿:

[zyf@centos7 ~]$iduid=1000(zyf)gid=1000(zyf)groups=1000(zyf),10(wheel)

解读:zyf的主要组是zyf(GID=1000),同时他还是wheel组的补充成员(GID=10)。

通俗理解:主要组是你的"户口所在地",补充组是你加入的"兴趣社团"。你建的文件默认落户口,但社团的资源——只要社团有权限——你也能用。

权限判定的规则很简单:用户访问一个文件时,只要他是文件的所有者,或者他属于文件的组所有者(不管是主要组还是补充组),就能按对应身份的权限去访问。


二、用户管理实战——增删改查

2.1 先认人——whoami / who / w / id / users

在动手创建用户之前,先搞清楚"我现在是谁"以及"系统里还有谁":

# 我是谁[root@centos7 ~]# whoamiroot# 谁在线?从哪连的?几点登录的?[zyf@centos7 ~]$whoroot pts/0 Dec2208:43(10.1.8.1)zyf pts/1 Dec2209:23(10.1.8.1)# w 比 who 多两行:系统运行了多久 + 每个用户在干嘛[zyf@centos7 ~]$ w 09:23:19 up1:10,3users, load average:0.00,0.01,0.05USERTTY FROM LOGIN@ IDLE JCPU PCPU WHAT root pts/010.1.8.1 08:4339:270.06s0.06s-bashzyf pts/110.1.8.1 09:232.00s0.05s0.01s w# 只看用户名,一行搞定[root@centos7 ~]# userszyf zyf root# 查特定用户详细信息[zyf@centos7 ~]$idzyfuid=1000(zyf)gid=1000(zyf)groups=1000(zyf),10(wheel)

速记whoami问自己,who问在线的人,w问他们在干嘛,id问某个用户的全部身份。

2.2useradd——新建一个"人"

最简用法:一个命令,系统帮你搞定一切:

[root@centos7 ~]# useradd user01[root@centos7 ~]# grep user01 /etc/passwduser01:x:1003:1003::/home/user01:/bin/bash

你只给了个名字,系统自动做了五件事:分配 UID、创建同名主组、指定家目录/home/user01、指定 shell 为/bin/bash、从/etc/skel/复制初始化文件到家目录。

但真实场景通常需要更多控制:

[root@centos7 ~]# useradd -u 8888 -d /opt/user02 -c "user for software manage" -g wheel -s /sbin/nologin user02
选项含义这个例子里做了什么
-u 8888指定 UIDUID = 8888
-d /opt/user02指定家目录不在/home/,跑去/opt/
-c "user for..."描述信息备注了这个人的用途
-g wheel指定主要组主要组设为 wheel(而不是自建同名组)
-s /sbin/nologin指定 shell不让这个人登录

验证结果:

[root@centos7 ~]# grep user02 /etc/passwduser02:x:8888:10:userforsoftware manager:/opt/user02:/sbin/nologin

2.3/etc/skel/——新用户的"家"从哪来

你注意到没有——每个新用户的家目录里都默认有.bashrc.bash_profile这些文件?它们不是凭空产生的,而是从/etc/skel/(骨架目录)复制过去的:

[root@centos7 ~]# ls -a ~tom....bash_logout .bash_profile .bashrc .mozilla[root@centos7 ~]# ls -a /etc/skel/....bash_logout .bash_profile .bashrc .mozilla

实战技巧:如果你想每个新用户都自带一份公司规范文档、自定义别名或特定的编辑器配置,把它扔进/etc/skel/,以后useradd的新用户自动继承。

2.4usermod——人变了,信息得更新

人不可能一成不变——换了部门、改了 shell、搬了家目录。usermod就是干这个的:

# 把 user02 的 UID 改成 1008,家目录搬到 /home/user02,shell 改回 bash[root@centos7 ~]# usermod user02 -u 1008 -md /home/user02 -s /bin/bash# -m:搬家——不光改配置,还物理移动家目录里的文件[root@centos7 ~]# grep user02 /etc/passwduser02:x:1008:10:userforsoftware manager:/home/user02:/bin/bash

添加补充组是高频操作,特别注意-a参数

# 把 user02 加入 user01 组[root@centos7 ~]# usermod -aG user01 user02[root@centos7 ~]# id user02uid=1008(user02)gid=10(wheel)groups=10(wheel),1003(user01)

为什么必须有-a(append)?因为你如果不加-ausermod -G user01 user02,结果就是把 user02 的补充组设置成只有 user01,原先的 wheel 组就被覆盖掉了。-a的意思是"追加",不是"覆盖"。

2.5userdel——删人别乱删

# 正常删除[root@centos7 ~]# userdel user03# 如果用户还在登录状态……[root@centos7 ~]# userdel user02userdel: user user02 is currently used by process9071# 尽量不要用 -f 强制删,先找到原因[root@centos7 ~]# userdel -f user02 # 暴力删,后续可能出问题

实战心法:删用户前,先用id 用户名确认这个人存在,再用who确认他没在线,最后再动手。


三、组管理实战——管理"团队"

组的增删改查比用户简单,但思路一样:

# 创建组[root@centos7 ~]# groupadd admin[root@centos7 ~]# groupadd sysadmin -g 2000 # 指定 GID# 改名、改 GID[root@centos7 ~]# groupmod --new-name admins admin[root@centos7 ~]# groupmod -g 2002 admins# 删除组[root@centos7 ~]# groupdel sysadmin

groupmems——往组里加人踢人

这是组管理中最实用的命令,让你不碰/etc/group文件就能操作组成员:

# 加人[root@centos7 ~]# groupmems -g admins -a zyf# 看成员[root@centos7 ~]# groupmems -g admins -lzyf# 踢人[root@centos7 ~]# groupmems -g admins -d zyf# 清空全组[root@centos7 ~]# groupmems -g admins -p

四、密码管理——谁说密码只能"输一次用到死"

4.1/etc/shadow——密码的真正存放地

你在/etc/passwd的第二个字段只看到了一个x。真正的密码加密信息在/etc/shadow里,一行九个字段:

[root@centos7 ~]# grep zyf /etc/shadowzyf:$6$m0OgWyIu$P2TF1pB8MO...J3LopEUdhmp/Ir/:19300:0:99999:7:::
字段含义实用技巧
登录名用户名
加密密码SHA-512 哈希!!*表示密码被锁定
上次改密码日期距 1970-1-1 的天数设为 0 = 强制用户下次登录改密码
最小密码天数两次改密码最小间隔0 = 随时可改
最大密码天数密码有效期99999 = 几乎不过期
告警天数过期前 N 天提醒7 = 提前一周唠叨
非活跃天数过期后还能用的宽限期
账户过期日期距 1970-1-1 的天数过期后账户被锁
保留字段目前空着

4.2chage——精细控制密码策略

chage(change age)让你不用手工改/etc/shadow,而是用命令精准控制密码的每一个时间参数:

# 查看当前设置[root@centos7 ~]# chage -l zyf最近一次密码修改时间 :11月 08,2022密码过期时间 :从不 密码失效时间 :从不 帐户过期时间 :从不 两次改变密码之间相距的最小天数 :0 两次改变密码之间相距的最大天数 :99999 在密码过期之前警告的天数 :7

改:

chage-M100zyf# 密码 100 天后过期chage-m10zyf# 改完密码后 10 天内不能改chage-d0zyf# 下次登录必须改密码chage-E1970-1-1 zyf# 账户直接过期,等于锁定

-d 0是最常用的——新员工入职分配临时密码,chage -d 0强制首次登录改掉,安全且优雅。

[root@centos7 ~]# chage -d 0 zyf[root@centos7 ~]# ssh zyf@localhostYou are required to change your password immediately(root enforced)WARNING: Your password has expired. You must change your password now and login again!

4.3 锁定、解锁、删密码——usermod的密码三连

# 锁定密码(密码还在,但前面加了 ! 标记,用正确密码也登不了)[root@centos7 ~]# usermod -L laowang# 等效于 passwd -l laowang# 解锁[root@centos7 ~]# usermod -U laowang# 等效于 passwd -u laowang# 删掉密码(空密码,输入用户名就能登录——极度危险)[root@centos7 ~]# passwd -d laowang
# 限制用户不能登录——改 shell 为 nologin[root@centos7 ~]# usermod -s /sbin/nologin laowang# 设置账户过期——基于日期[root@centos7 ~]# usermod -e 2024-7-18 laowang

三种"禁用用户"的手段对号入座

  • -L:保留账户,只锁密码。适合"暂时不让上,回头再解开"。
  • -s /sbin/nologin:禁止登录但保留服务账户身份。适合系统用户。
  • -e 过期日期:到了日期自动作废。适合"合同到期自动关"。

4.4 一个"黑暗知识":UID 0 就是 root

你知道/etc/passwd里 UID 字段改成 0 意味着什么吗?

# 方法一:直接改 passwd[root@centos7 ~]# vim /etc/passwdzyf:x:0:1000:zyf:/home/zyf:/bin/bash# zyf 现在等同于 root# 方法二:创建时指定[root@centos7 ~]# useradd -o -u 0 zyf# -o:允许 UID 重复(因为 root 已经占用了 UID 0)

zyfroot从系统角度看是两个不同的账户,但 zyf 拥有了 root 的全部权限。这就是为什么/etc/passwd的写权限是系统安全的生命线。理解了这一点,你就理解了整个 Linux 权限模型的根基。


五、故障案例——三个经典翻车现场

5.1 手动创建一个用户——理解背后的四步

只用命令是学不透的。亲手走一遍系统背后做的事,你才算真正理解:

# 1. 写入 passwd(注意 UID 别跟已有用户冲突)[root@centos7 ~]# vim /etc/passwdzhangsan:x:1002:1002::/home/zhangsan:/bin/bash# 2. 写入 group[root@centos7 ~]# vim /etc/groupzhangsan:x:1002:# 3. 写入 shadow(复制已有的密码哈希,或创建一个)[root@centos7 ~]# vim /etc/shadowzhangsan:$6$...(hash)...::0:99999:7:::# 4. 准备家目录[root@centos7 ~]# cp -r /etc/skel/ /home/zhangsan[root@centos7 ~]# chown -R zhangsan:zhangsan /home/zhangsan# 验证[root@centos7 ~]# ssh zhangsan@localhost

搞懂了这四步,你就知道useradd这个命令本质上是帮你做了这四件事的"一键脚本"。

5.2 提示符变成了bash-4.2$?别慌

这是新人常见的心跳骤停时刻。正常提示符应该是[zhangsan@centos7 ~]$,但突然变成了:

bash-4.2$

原因/etc/bashrc找不到了。bash 在启动时读取这个文件来设置提示符格式、别名等,文件没了,bash 就退回最原始的"出厂状态"。

模拟故障:

[root@centos7 ~]# mv /etc/bashrc{,.ori}[root@centos7 ~]# bashbash-4.2#

恢复:

bash-4.2# mv /etc/bashrc{.ori,}bash-4.2# bash[root@centos7 ~]# # 回来了

5.3 误删家目录

[root@centos7 ~]# ssh zhangsan@localhostCould not chdir to home directory /home/zhangsan: No suchfileor directory -bash-4.2$

这同时触发了两个故障:家目录没了 + 提示符不正常。解决思路很直接——从骨架目录重建:

[root@centos7 ~]# cp -r /etc/skel/ /home/zhangsan[root@centos7 ~]# chown -R zhangsan:zhangsan /home/zhangsan

5.4 家目录权限不对

Could not chdir to home directory /home/zhangsan: Permission denied -bash: /home/zhangsan/.bash_profile: 权限不够

问题出在权限上——用户对自家目录的权限被拿掉了:

# 模拟[root@centos7 ~]# chmod u=- /home/zhangsan# 修复[root@centos7 ~]# chown -R zhangsan:zhangsan /home/zhangsan[root@centos7 ~]# chmod u=rwx /home/zhangsan

教训:家目录的所属者和权限是"绑定"的——所属者不对,用户打不开;权限被清,用户也打不开。两者缺一不可。


今日骚操作

# 一条命令走完用户管理的全生命周期:创建→设密码→加组→改策略→验证useraddlaozhang-c"Test User"&&\echoredhat|passwd--stdinlaozhang&&\usermod-aGwheel laozhang&&\chage-d0-M90-m3laozhang&&\echo"=== 用户信息 ==="&&idlaozhang&&\echo"=== 密码策略 ==="&&chage-llaozhang&&\echo"=== passwd 条目 ==="&&greplaozhang /etc/passwd

拆解:创建用户 → 设密码 → 加入 wheel 组 → 设密码策略(首次登录改密码、90天过期、3天内不能改)→ 三连验证。一条命令,用户管理的核心流程全在里面。


下一篇预告:Day 05(下)我们聊聊 Linux 的提权机制(susudo)以及文件权限体系(rwx)——你有了自己的账号,但怎么临时获得管理员权限?sudo 为什么比 su 更安全?文件的-rw-r--r--到底怎么读?

今日练习:创建三个用户分别用不同的密码策略,然后用chage -l对比查看;把/etc/passwd/etc/group/etc/shadow三个文件用自己的话讲给别人听——能讲清楚,才是真懂了。