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来标识方便人类记忆。但在系统内部真正区分你和其他人的是一串数字——UIDUser 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/shadowUID用户 ID1000系统内部用这串数字认人GID主组ID1000你属于哪个主要组GECOS描述信息software admin注释栏可以写真实姓名/部门directory家目录/home/zyf登录后默认呆的地方shell登录 shell/bin/bash登录后跑什么程序来跟你交互注意一点系统用户的 shell 通常是/sbin/nologin。这不是一个真正的 shell而是一把锁——告诉系统这个账号不是用来登录的。比如postfix用户[zyfcentos7 ~]$greppostfix /etc/passwd postfix:x:89:89::/var/spool/postfix:/sbin/nologin1.3/etc/group——组是用户的团队组的概念不难理解一个组就是一个团队加入团队就继承团队的权限。和用户一样组有名字人类看的和 GID系统认的。/etc/group一行一个组四个字段group_name:password:GID:user_list[zyfcentos7 ~]$grepwheel /etc/group wheel:x:10:zyf字段含义解释group_name组名wheel——管理员组password组密码x 表示密码在别处基本用不到GID组 ID10user_list补充成员zyf是这个组的补充成员1.4 主要组 vs 补充组——你必须搞清的一对多关系每个用户只有一个主要组primary group定义在/etc/passwd的 GID 字段。默认情况下用户新建的文件组所有者就是这个主要组。但用户还可以有多个补充组supplementary groups定义在/etc/group的 user_list 里。用id命令一眼看穿[zyfcentos7 ~]$iduid1000(zyf)gid1000(zyf)groups1000(zyf),10(wheel)解读zyf的主要组是zyfGID1000同时他还是wheel组的补充成员GID10。通俗理解主要组是你的户口所在地补充组是你加入的兴趣社团。你建的文件默认落户口但社团的资源——只要社团有权限——你也能用。权限判定的规则很简单用户访问一个文件时只要他是文件的所有者或者他属于文件的组所有者不管是主要组还是补充组就能按对应身份的权限去访问。二、用户管理实战——增删改查2.1 先认人——whoami / who / w / id / users在动手创建用户之前先搞清楚我现在是谁以及系统里还有谁# 我是谁[rootcentos7 ~]# whoamiroot# 谁在线从哪连的几点登录的[zyfcentos7 ~]$whoroot pts/0 Dec2208:43(10.1.8.1)zyf pts/1 Dec2209:23(10.1.8.1)# w 比 who 多两行系统运行了多久 每个用户在干嘛[zyfcentos7 ~]$ 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# 只看用户名一行搞定[rootcentos7 ~]# userszyf zyf root# 查特定用户详细信息[zyfcentos7 ~]$idzyfuid1000(zyf)gid1000(zyf)groups1000(zyf),10(wheel)速记whoami问自己who问在线的人w问他们在干嘛id问某个用户的全部身份。2.2useradd——新建一个人最简用法一个命令系统帮你搞定一切[rootcentos7 ~]# useradd user01[rootcentos7 ~]# grep user01 /etc/passwduser01:x:1003:1003::/home/user01:/bin/bash你只给了个名字系统自动做了五件事分配 UID、创建同名主组、指定家目录/home/user01、指定 shell 为/bin/bash、从/etc/skel/复制初始化文件到家目录。但真实场景通常需要更多控制[rootcentos7 ~]# 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不让这个人登录验证结果[rootcentos7 ~]# grep user02 /etc/passwduser02:x:8888:10:userforsoftware manager:/opt/user02:/sbin/nologin2.3/etc/skel/——新用户的家从哪来你注意到没有——每个新用户的家目录里都默认有.bashrc、.bash_profile这些文件它们不是凭空产生的而是从/etc/skel/骨架目录复制过去的[rootcentos7 ~]# ls -a ~tom....bash_logout .bash_profile .bashrc .mozilla[rootcentos7 ~]# ls -a /etc/skel/....bash_logout .bash_profile .bashrc .mozilla实战技巧如果你想每个新用户都自带一份公司规范文档、自定义别名或特定的编辑器配置把它扔进/etc/skel/以后useradd的新用户自动继承。2.4usermod——人变了信息得更新人不可能一成不变——换了部门、改了 shell、搬了家目录。usermod就是干这个的# 把 user02 的 UID 改成 1008家目录搬到 /home/user02shell 改回 bash[rootcentos7 ~]# usermod user02 -u 1008 -md /home/user02 -s /bin/bash# -m搬家——不光改配置还物理移动家目录里的文件[rootcentos7 ~]# grep user02 /etc/passwduser02:x:1008:10:userforsoftware manager:/home/user02:/bin/bash添加补充组是高频操作特别注意-a参数# 把 user02 加入 user01 组[rootcentos7 ~]# usermod -aG user01 user02[rootcentos7 ~]# id user02uid1008(user02)gid10(wheel)groups10(wheel),1003(user01)为什么必须有-aappend因为你如果不加-ausermod -G user01 user02结果就是把 user02 的补充组设置成只有 user01原先的 wheel 组就被覆盖掉了。-a的意思是追加不是覆盖。2.5userdel——删人别乱删# 正常删除[rootcentos7 ~]# userdel user03# 如果用户还在登录状态……[rootcentos7 ~]# userdel user02userdel: user user02 is currently used by process9071# 尽量不要用 -f 强制删先找到原因[rootcentos7 ~]# userdel -f user02 # 暴力删后续可能出问题实战心法删用户前先用id 用户名确认这个人存在再用who确认他没在线最后再动手。三、组管理实战——管理团队组的增删改查比用户简单但思路一样# 创建组[rootcentos7 ~]# groupadd admin[rootcentos7 ~]# groupadd sysadmin -g 2000 # 指定 GID# 改名、改 GID[rootcentos7 ~]# groupmod --new-name admins admin[rootcentos7 ~]# groupmod -g 2002 admins# 删除组[rootcentos7 ~]# groupdel sysadmingroupmems——往组里加人踢人这是组管理中最实用的命令让你不碰/etc/group文件就能操作组成员# 加人[rootcentos7 ~]# groupmems -g admins -a zyf# 看成员[rootcentos7 ~]# groupmems -g admins -lzyf# 踢人[rootcentos7 ~]# groupmems -g admins -d zyf# 清空全组[rootcentos7 ~]# groupmems -g admins -p四、密码管理——谁说密码只能输一次用到死4.1/etc/shadow——密码的真正存放地你在/etc/passwd的第二个字段只看到了一个x。真正的密码加密信息在/etc/shadow里一行九个字段[rootcentos7 ~]# 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——精细控制密码策略chagechange age让你不用手工改/etc/shadow而是用命令精准控制密码的每一个时间参数# 查看当前设置[rootcentos7 ~]# 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强制首次登录改掉安全且优雅。[rootcentos7 ~]# chage -d 0 zyf[rootcentos7 ~]# ssh zyflocalhostYou 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的密码三连# 锁定密码密码还在但前面加了 ! 标记用正确密码也登不了[rootcentos7 ~]# usermod -L laowang# 等效于 passwd -l laowang# 解锁[rootcentos7 ~]# usermod -U laowang# 等效于 passwd -u laowang# 删掉密码空密码输入用户名就能登录——极度危险[rootcentos7 ~]# passwd -d laowang# 限制用户不能登录——改 shell 为 nologin[rootcentos7 ~]# usermod -s /sbin/nologin laowang# 设置账户过期——基于日期[rootcentos7 ~]# usermod -e 2024-7-18 laowang三种禁用用户的手段对号入座-L保留账户只锁密码。适合暂时不让上回头再解开。-s /sbin/nologin禁止登录但保留服务账户身份。适合系统用户。-e 过期日期到了日期自动作废。适合合同到期自动关。4.4 一个黑暗知识UID 0 就是 root你知道/etc/passwd里 UID 字段改成 0 意味着什么吗# 方法一直接改 passwd[rootcentos7 ~]# vim /etc/passwdzyf:x:0:1000:zyf:/home/zyf:/bin/bash# zyf 现在等同于 root# 方法二创建时指定[rootcentos7 ~]# useradd -o -u 0 zyf# -o允许 UID 重复因为 root 已经占用了 UID 0zyf和root从系统角度看是两个不同的账户但 zyf 拥有了 root 的全部权限。这就是为什么/etc/passwd的写权限是系统安全的生命线。理解了这一点你就理解了整个 Linux 权限模型的根基。五、故障案例——三个经典翻车现场5.1 手动创建一个用户——理解背后的四步只用命令是学不透的。亲手走一遍系统背后做的事你才算真正理解# 1. 写入 passwd注意 UID 别跟已有用户冲突[rootcentos7 ~]# vim /etc/passwdzhangsan:x:1002:1002::/home/zhangsan:/bin/bash# 2. 写入 group[rootcentos7 ~]# vim /etc/groupzhangsan:x:1002:# 3. 写入 shadow复制已有的密码哈希或创建一个[rootcentos7 ~]# vim /etc/shadowzhangsan:$6$...(hash)...::0:99999:7:::# 4. 准备家目录[rootcentos7 ~]# cp -r /etc/skel/ /home/zhangsan[rootcentos7 ~]# chown -R zhangsan:zhangsan /home/zhangsan# 验证[rootcentos7 ~]# ssh zhangsanlocalhost搞懂了这四步你就知道useradd这个命令本质上是帮你做了这四件事的一键脚本。5.2 提示符变成了bash-4.2$别慌这是新人常见的心跳骤停时刻。正常提示符应该是[zhangsancentos7 ~]$但突然变成了bash-4.2$原因/etc/bashrc找不到了。bash 在启动时读取这个文件来设置提示符格式、别名等文件没了bash 就退回最原始的出厂状态。模拟故障[rootcentos7 ~]# mv /etc/bashrc{,.ori}[rootcentos7 ~]# bashbash-4.2#恢复bash-4.2# mv /etc/bashrc{.ori,}bash-4.2# bash[rootcentos7 ~]# # 回来了5.3 误删家目录[rootcentos7 ~]# ssh zhangsanlocalhostCould not chdir to home directory /home/zhangsan: No suchfileor directory -bash-4.2$这同时触发了两个故障家目录没了 提示符不正常。解决思路很直接——从骨架目录重建[rootcentos7 ~]# cp -r /etc/skel/ /home/zhangsan[rootcentos7 ~]# chown -R zhangsan:zhangsan /home/zhangsan5.4 家目录权限不对Could not chdir to home directory /home/zhangsan: Permission denied -bash: /home/zhangsan/.bash_profile: 权限不够问题出在权限上——用户对自家目录的权限被拿掉了# 模拟[rootcentos7 ~]# chmod u- /home/zhangsan# 修复[rootcentos7 ~]# chown -R zhangsan:zhangsan /home/zhangsan[rootcentos7 ~]# chmod urwx /home/zhangsan教训家目录的所属者和权限是绑定的——所属者不对用户打不开权限被清用户也打不开。两者缺一不可。今日骚操作# 一条命令走完用户管理的全生命周期创建→设密码→加组→改策略→验证useraddlaozhang-cTest 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 的提权机制su和sudo以及文件权限体系rwx——你有了自己的账号但怎么临时获得管理员权限sudo 为什么比 su 更安全文件的-rw-r--r--到底怎么读今日练习创建三个用户分别用不同的密码策略然后用chage -l对比查看把/etc/passwd、/etc/group、/etc/shadow三个文件用自己的话讲给别人听——能讲清楚才是真懂了。