
从Day01一路走到Day05Linux基础系列终于要碰权限体系里最绕的部分了。今天的内容安排是命令补充用户及组账号管理密码管理三块看起来像是零散知识点的堆砌实际上它们是咬合在一起的命令是操作工具用户和组是权限的主体密码则是身份验证的第一道关口。学完这一天你能独立完成创建用户、分配权限、重置密码、锁定账号这些企业里每天都在做的运维工作也能真正看懂/etc/passwd和/etc/shadow里每一列到底在说什么。这篇笔记面向刚学完基础命令、准备进入账户权限阶段的读者也适合那些用Linux却对用户体系一知半解的人。我会把三块内容串成一条线来拆解每个命令都配上实际场景和踩过的坑尽量让你看完就能上手。1. 内容整体设计与思路拆解1.1 为什么Day05安排这三块内容如果你按部就班学Linux前面几天应该接触了文件操作、目录管理、重定向、管道这些基础命令。但你会发现一个尴尬的问题你只能用root或者当前登录的普通用户操作遇到创建账号给别人用限制某个人的权限密码丢了怎么找回这种真实需求完全无从下手。这正是Day05要解决的。先补命令是因为后面讲用户管理时要用到grep、tail、cut来查配置文件用chown、chmod来调整归属和权限用usermod来改用户属性。这些命令散落在不同场景里单独看没什么感觉但放在用户管理这个上下文中它们的价值立刻暴露出来。所以我个人讲课或写笔记的习惯是把命令补充放在一个具体任务前置的位置而不是孤零零列一串命令让你背。命令补充的另一个作用是覆盖那些面试要问、实战常用、但基础教程不细讲的命令。比如which和whereis找命令路径、find按条件搜文件、history看历史命令、alias设置别名。这些命令本身不难难的是知道什么时候用它们。我会结合用户管理场景逐个拆开讲。1.2 用户、组、密码三者的逻辑链路很多人学用户管理时容易犯一个毛病把所有命令背下来却不知道背后的设计逻辑。其实Linux的用户体系就三句大白话第一句用户是身份的标识。系统通过UID用户ID而不是用户名来区分不同用户用户名只是给人看的标签。这解释了为什么你删掉一个用户再创建一个同名的看似同名其实是不同的账号UID不一样。第二句组是权限的集合。一个组可以包含多个用户一个用户也可以属于多个组一个主组加多个附加组。组存在的意义是简化权限分配你不需要给十个用户分别授权把他们塞进一个组然后给这个组授权就够了。第三句密码是身份验证的凭证。用户要登录系统要验证密码密码不能明文存储所以有了/etc/shadow这个加密文件。密码还有时效策略比如90天必须换一次这就引出了chage命令。这三句话串起来就是这一天的核心逻辑先知道有哪些账号用户和组再知道怎么创建和修改管理命令最后知道怎么保证账号安全密码策略。1.3 学前需要掌握的基础储备在进入正题前确认你已经具备以下基础会使用ls、cat、grep、tail这些基础命令了解/目录下etc、home、var这些常见目录的作用知道sudo大概是提权用的。如果这些还不熟建议先回看前几天的内容不然直接看配置文件会有点费劲。实操环境方面我用的是CentOS 7.9和Ubuntu 22.04两套系统做过验证大部分命令和配置文件兼容。如果你用的是国产化系统比如麒麟、统信UOS命令用法基本一致个别路径和默认配置会有差异我写到的注意点里会单独说明。2. 命令补充环节常用必备命令与组合技巧2.1 定位与查询类命令的实战用法先讲几个查命令、查文件的命令因为做用户管理时你一定离不开它们。which用来查可执行程序在PATH中的位置。比如执行which useradd输出/usr/sbin/useradd你就能知道刚才敲的命令实际是哪个文件。whereis更进一步除了命令位置还会返回手册页和源码路径比如whereis passwd会显示/usr/bin/passwd和手册位置。这两个命令的区别值得留意which只看PATH环境变量whereis在标准目录里搜索所以偶尔会出现which找不到但whereis能找到的情况。find是文件搜索里的重武器。基础用法是find 路径 -name 文件名比如find /etc -name passwd。但更常用的是按属性组合搜索-user按属主找、-group按属组找、-size按大小找、-mtime按修改时间找。举个用户管理的场景你想找出所有属于zhangsan的文件以便在删除用户前备份干净可以执行find / -user zhangsan 2/dev/null这里把2/dev/null加上是为了屏蔽权限不足的报错不然刷屏刷得你怀疑人生。配合-exec还能直接对结果执行操作比如find / -user zhangsan -exec ls -lh {} \;。注意{}和\;的写法这是固定语法少一个都不行。grep也是这一天的隐形主角。查配置文件时你最常做的事就是在文件里过滤关键字。比如看系统上有哪些用户能登录我会用grep -v nologin\|false /etc/passwd这条命令会排除掉所有shell为nologin或false的伪用户剩下的基本就是能登进去的真实账号。-v是取反\|表示或者都是非常高频的用法。2.2 管道、重定向与快捷键的进阶组合命令补充里最容易忽略的其实是组合能力。单看每个命令都简单但用管道串起来能解决很复杂的问题。比如你想统计系统里真实用户的数量grep -v nologin\|false /etc/passwd | wc -l又比如你想查看最近被修改过密码的5个用户head -n 5 /etc/shadow | cut -d: -f1这里cut -d: -f1的意思是按冒号分隔取第一列。/etc/shadow里每个字段都是冒号分隔这种组合特别实用。重定向往文件写内容的时间点也到了。创建用户时你可能会写批处理脚本把用户列表写进文本然后用循环读取。这时候你会用到echo user1 users.txt和echo user2 users.txt的区别覆盖写追加写。这个区别看着简单但实际运维时经常因为搞混而覆盖了重要文件务必形成肌肉记忆。另外特别想提醒一个容易踩坑的快捷键CtrlD是退出当前登录会话CtrlC是中断当前命令。很多人刚学时手指一滑就按错了在编辑用户信息时不小心CtrlD直接退出连接相当于白干。还有Tab补全键敲pw两下Tab系统会列出passwd和pwck等候选这个习惯越早养成越好后面打长参数名的时候能省一半时间。2.3 历史命令与别名偷懒但高效的利器history命令在排查问题时就是救命稻草。有次我在一台服务器上误删了一个目录第一反应就是执行history | grep rm -rf看一下到底误敲了哪条命令因为屏幕上早就刷没了。还有当你怀疑某个人改过配置history也能帮你佐证。别以为history只能看它还能直接调用!100表示执行历史记录里第100条命令!!表示执行上一条命令。我个人的使用习惯是忘记之前跑过什么命令但记得大概的关键字就用history | grep 关键字连续重复执行同一条命令时连输几遍!!非常爽。alias是别名命令作用是给长命令起个短名字。比如我习惯把查看长日志的命令缩简化alias llls -lh --colorauto alias mygrepgrep -n --colorauto设置完下次输入ll就等同于输入后面那串。但注意临时设置的别名只在当前会话有效要永久生效得写进~/.bashrc或/etc/bashrc。有个坑是如果你在脚本里用了alias但没启用扩展可能不生效因为脚本默认非交互式Shell是不读.bashrc的。这点新手容易困惑先记住别名适合交互式使用脚本里尽量写完整命令。3. 用户及组账号管理从配置文件到完整实操3.1 看懂账号核心三个文件/etc/passwd、/etc/shadow、/etc/groupLinux的用户信息不是存在数据库里的而是存在纯文本文件里的。这个设计决定了所有用户管理操作本质上都是在改这几个文件。所以学用户管理第一步不是背命令而是吃透这三个文件你看懂它们后命令就是给这些文件做增删改查的工具而已。先看/etc/passwd一行就是一个用户冒号分隔七个字段。顺序分别是用户名、密码占位符、UID、主组GID、注释信息、家目录路径、登录Shell。我用zhangsan举例zhangsan:x:1001:1001:张三:/home/zhangsan:/bin/bash这里第二个字段是x表示真实密码已经被移动到/etc/shadow这从一开始就是这样设计的——/etc/passwd在每个用户眼里都是可读的如果把密码放这里就全泄露了。最后一个字段/bin/bash表示这个用户能登录Shell如果改成/sbin/nologin对方就登不进来很多服务账号就这么设置的。然后是/etc/shadow这个文件只有root能读。同样是冒号分隔但字段更多也更敏感共九个字段。前几个是用户名、加密后的密码、密码最后一次修改日期从1970年1月1日起的天数、最短修改天数、最长有效天数、到期前提醒天数、账号宽限天数、账号过期日期最后留作保留字段。举个真实例子zhangsan:$6$salt$hash:19001:0:90:7:5::$6$代表SHA-512加密算法后面是盐值和哈希串。19001是最后一次改密距1970年的天数。0表示可以随时改90表示密码最长用90天7表示到期前7天开始提醒5表示密码到期后还有5天宽限期。这些参数就是密码策略落地的具体数字后面配置chage就是改这里。最后是/etc/group一行一个组四个字段组名、组密码占位符、GID、成员列表逗号分隔。如dev:x:2000:zhangsan,lisi,wangwu这表示dev组的GID是2000包含三个成员。如果你看到某个组的成员列表为空别急着奇怪可能成员的主组就是它主组成员不会出现在这个列表里这个细节很多人会搞错。注意解读/etc/shadow时很多教程会说第二个字段就是密码严格来说这是加密后的哈希值不是明文。如果看到字段是!或*开头表示这个账号的密码被锁定无法登录。3.2 useradd创建用户的完整参数与常见误区useradd是创建用户的总命令语法是useradd [参数] 用户名。参数很多但实际工作中常用的就那几个参数作用示例-u指定UID不指定则系统自动分配useradd -u 1500 zhangsan-g指定主组组必须已存在useradd -g dev zhangsan-G指定附加组多个组逗号分隔useradd -G dev,ops zhangsan-d指定家目录路径useradd -d /app/data zhangsan-s指定登录Shelluseradd -s /bin/bash zhangsan-c添加注释信息useradd -c 张三-开发 zhangsan-M不创建家目录useradd -M zhangsan-r创建系统账号UID从系统范围分配useradd -r -s /sbin/nologin apache我建议你养成一个好习惯创建用户时明确指定-g主组和-sShell而不是全用默认值。为什么默认情况下CentOS会为每个新用户创建同名主组如zhangsan一个组默认Shell是/bin/bash这在单用户场景问题不大但一旦涉及团队协作和权限隔离默认组名会把你绕晕。比如你建了lisi和wangwu两个用户想让它们同属dev组就得在创建时指定-g dev否则两个账号互不相干。还有个实际坑用useradd创建用户后用户是没有密码的直接登录会失败。这是设计如此因为useradd只创建账号密码必须通过passwd命令设置。所以你在脚本里如果只执行useradd而不跟echo 123456 | passwd --stdin反过来测的时候会发现怎么都登不进去。CentOS里可以用passwd --stdin批量设置Ubuntu没有这个参数要用chpasswd命令替代这是同一个需求在两个发行版上的典型差异。3.3 usermod、userdel修改与删除用户时最容易出事的两个命令usermod是修改现有用户属性的命令用法和useradd高度重合usermod -s /bin/bash zhangsan修改Shellusermod -d /home/newdir zhangsan修改家目录usermod -G dev,ops zhangsan重设附加组列表。注意最后一个参数的坑-G是整体覆盖如果你原来的附加组是ops现在用-G dev会把ops移除所以追加附加组时要带上已有的组比如usermod -G ops,dev zhangsan。要锁定和解锁用户也有独立参数usermod -L锁定passwd前面会多一个!usermod -U解锁。userdel删除用户时默认只删账号不删家目录和邮件池。你在生产环境删人时一定要先想清楚userdel -r zhangsan-r会连同家目录一起删掉。但即使加了-r用户的家目录下如果有别的应用生成的数据比如数据库导出文件、临时上传文件也未必清理干净。我处理离职员工的账号时惯例是先锁账号usermod -L或passwd -l然后备份家目录等确认所有数据都移交了再执行userdel -r。而不是一上来就删万一哪个系统对着这个人的UID还有定时任务删除后文件归属会变成无名数字排查起来极费劲。删除用户还有一个经常被忽视的点你要检查这个用户是否还有进程在跑、是否有定时任务、是否有文件归属没清理。可以用之前学的命令配合起来查ps -u zhangsan crontab -l -u zhangsan find / -user zhangsan 2/dev/null如果ps -u zhangsan还有输出说明这台机器上还有他的进程在跑强行删账号会导致进程还在但归属已无主后续想清理都不知道是哪个应用起的。这种物理上先锁逻辑上后删的流程是我在多次线上故障后总结出来的建议直接抄作业。3.4 组账号管理groupadd、groupmod、groupdel与常见组策略组管理相对简单常用命令就三个groupadd创建组、groupmod修改组名或GID、groupdel删除组。创建组时最常用参数是-g指定GID和-r创建系统组。修改组名示例groupmod -n devgroup dev这条命令把dev组改名为devgroup。注意修改组名后文件系统里原本归属dev组的文件会继续用GID标记但通过ls -l显示时因为你本地已经改了名会显示新名字devgroup逻辑上没有冲突但如果远程有别的系统依赖旧组名做映射就可能出现显示异常。删除组的风险点是要确认没有用户的主组是它。如果一个用户主组还是在的组你直接groupdel会报错cannot remove the primary group of user zhangsan。这时候要么把用户的主组改掉要么先删用户再删组。很多人在搭建测试环境时反复重建组碰到这个报错就懵其实冷静想想设计逻辑就通了组是用户的主组时删除组等于把用户丢到一个不存在的组里系统不允许。组的最有价值用途是通过/etc/group成员列表实现权限共享。企业里最常见的做法是建一个webadmin组把维护网站的人全加进去然后让某个web目录的属组为webadmin并设置chmod -R 2775 /var/www/html。其中2代表SGID位它让新创建的文件自动继承目录的属组而不是创建者的主组这样团队协作时文件永远属于webadmin组权限不乱。这就是组管理落地的经典场景。4. 密码管理从安全策略到日常运维4.1 passwd命令详解改密、锁账号、批量设置说到密码管理第一个绕不开的就是passwd。它几个最常见的用法是passwd修改当前用户自己的密码passwd zhangsanroot修改指定用户的密码passwd -l zhangsan锁定账号密码-u解锁passwd -d zhangsan删除密码使其只能无密码登录危险操作慎用passwd -S zhangsan查看账号密码状态修改密码时有严格的安全策略新密码必须满足最小长度、包含字符类型、不能是前一次密码的简单变体等。很多人在测试环境里喜欢把密码设成123456结果系统直接报BAD PASSWORD提示你太简单了。生产环境不建议改弱密码策略测试环境可以临时放宽方法因版本而异CentOS改/etc/pam.d/system-auth或/etc/login.defs里的PASS_MAX_DAYS等参数Ubuntu修改PAM模块配置。批量设置密码是企业里的高频需求。某次我批量创建20个开发账号一个个执行passwd交互式输入太慢了于是写了循环脚本for i in {1..20}; do useradd -g dev -s /bin/bash -M user$i echo user$i:Init123456 | chpasswd doneCentOS也可以用echo 密码 | passwd --stdin 用户名但chpasswd在两大发行版通吃更通用。执行完后第一件事是强行要求对方下次登录改密码chage -d 0 user$i-d 0表示密码最后一次修改日期设为1970年1月1日这样系统会认定密码已过期下次登录必须先改密码。这个组合拳我几乎每周都会用强烈推荐。4.2 chage密码策略的时间控制器chage是用来控制密码生命周期的重要手段。刚讲完/etc/shadow里的数字现在看它们怎么通过命令设置chage -m 7 zhangsan密码最短7天才能改chage -M 90 zhangsan密码最长90天超过就失效chage -W 7 zhangsan到期前7天告警chage -I 5 zhangsan密码到期后宽限5天超过则锁账号chage -E 2025-12-31 zhangsan账号到期日到期后无法登录chage -l zhangsan查看用户的密码策略信息这些参数组合起来就是一张完整的密码策略表。比如给一个外包人员开半年临时账号我会执行chage -m 0 -M 90 -W 7 -I 7 -E 2025-12-31 zhangsan含义是随时改密密码90天后失效提前7天提醒失效后7天宽限期账号在年底那天过期。这些策略都写进/etc/shadow对应的字段里你用chage -l查看的时候能看到解释得很清楚的中文描述非常友好。有一个坑特别值得说很多人设置了-M 90但发现账号过了90天还能登录原因往往是-I宽限期还在或者账号设置了免改密shadow里密码字段前含!时会跳过某些策略。排查这类问题时我第一反应是chage -l看看每项值第二反应是检查/etc/login.defs里的全局默认值因为命令设置的是单用户覆盖全局默认值决定普通新建用户的基础策略。4.3 su与sudo密码在提权场景中的正确姿势密码管理还有一个常见应用场景是提权。很多人分不清su和sudo其实一句话能概括su切换用户身份默认要目标用户密码sudo以root身份执行单条命令要的是你自己当前用户的密码。su最常见的坑是没加-su zhangsan和su - zhangsan不一样。前者保留当前环境的变量直接切过去后者是完整登录Shell相当于以该用户身份重新登录会加载目标用户的环境变量。实际运维中如果你切换了用户但发现java命令找不到了大概率是你用了不带-的su把一堆PATH环境变量带过去了。这属于非常典型的低级但高频的问题。sudo的精髓在于它的授权配置文件/etc/sudoers。配置文件里一行一条规则比如给zhangsan授权所有root命令zhangsan ALL(ALL) ALL或者只允许他重启服务zhangsan ALL(ALL) /usr/bin/systemctl restart *改/etc/sudoers必须要用visudo命令。原因很实在visudo会在你保存时检查语法如果语法错误它不会让你退出去避免产生一个无法解析的sudoers文件。一旦sudoers坏了所有sudo都会瞬间报错连visudo都跑不了那种局面处理起来相当痛苦。所以哪怕是临时加一行也不要直接编辑一定要走visudo这算是我踩过坑以后的肌肉记忆。4.4 忘记root密码的应急恢复流程密码管理的最后一课是忘记root密码。遇到过太多次类似场景某台服务器的root密码交接时没记全人离岗了密码丢了。如果你还能通过控制台物理访问或云平台VNC连接在GRUB引导界面进行单用户模式登录即可重置流程如下在GRUB菜单停留时按键e进入编辑找到以linux或linux16开头的行在末尾追加rd.breakCentOS系统会进入initramfs的紧急Shell环境或者init/bin/bash老式系统的单用户模式。然后切换根目录、重新挂载、改密码mount -o remount,rw /sysroot chroot /sysroot passwd root touch /.autorelabel # CentOS系需要触发SELinux重新标记 exit reboot每一步都要仔细别漏掉mount那一步——不重新挂载成读写模式passwd根本写不进shadow。还有CentOS需要touch /.autorelabel因为改密码涉及SELinux属性不触发重新标记可能导致重启后密码无法验证。Ubuntu体系略有差别但不改密码的本质流程是一样的。注意这个流程只建议在你真正拥有这台服务器的物理控制权或云主机VNC访问权限时操作。如果是在共享环境或别人托管的环境未经授权重置他人设备的root密码是不被允许的操作请务必遵守相关管理规定切勿用在未经授权的机器上。5. 常见问题与排查技巧实录5.1 密码修改常见报错与根治方案做运维测试时最常撞见的报错是passwd: Authentication token manipulation error。这个英文很拗口本质原因就几种密码写不进/etc/shadow或者shadow文件被锁、权限不对、磁盘满、SELinux阻止。排查顺序我固定是这样的第一步先看shadow文件权限正常是-rw-------且属主root如果你之前手动chmod改坏了先改回来。第二步看磁盘写满没有。第三步查SELinux状态临时允许一下试试。如果都正常但还是报错可能是PAM配置限制Ubuntu里这个报错还常常和密码复杂度策略冲突有关换一个更复杂的密码往往就能通过了。创建用户时还有个高频报错useradd: warning: cannot create users home directory。多半是你指定的家目录父路径不存在。比如useradd -d /app/data/zhangsan但/app/data目录没提前创建系统不会自动建父目录于是报错。解决方式很简单先mkdir -p /app/data再执行useradd。若不想手动建目录也可以依赖系统默认路径让它帮你创建/home/zhangsan。5.2 用户删除后文件归属变数字的排查有一种现象在清理账号后特别扎眼ls -l时属主显示成1001这种数字而不是用户名。这是因为文件的所有者UID已经不存在了系统只知道数字映射不到名字。遇到这种情况别慌这不是磁盘损坏只是用户记录没了。处理这种事要看文件的用途。如果文件还需要保留给其他用户使用可以用chown改成新归属chown -R lisi:dev /srv/old_data。如果文件是垃圾直接清掉。这里最大的教训不是命令本身而是流程删用户前先find / -user 用户名把归属文件清单导出来确认哪些要移交、哪些要删除这样账号删完以后不会留下不知道归谁的一堆数字文件。5.3 /etc/shadow 误操作导致无法登录的急救/etc/shadow是高危文件手误改坏的后果往往是所有账号都无法登录。有一次我在测试机上给某个用户追加注释没看清字段数量把字段顺序搞错了结果那个账号直接登录失败报错信息含糊不清光看报错根本看不出是shadow文件坏了。排查手段有两个第一用pwck命令检查用户数据库一致性它会逐行验证/etc/passwd和/etc/shadow的字段数、格式、UID对应关系哪里不对它直接报给你。第二用awk -F: {print NF} /etc/shadow查看每一行的字段数正常的shadow每一行都应该是9个字段如果发现某行不是9大概率就是那行坏了。急救思路是这样的如果只是某个用户坏了用vipw进入编辑器把这一行按正确格式修复。vipw和visudo一个道理会自动加锁防止并发写坏。如果整个shadow文件都乱了就只能从备份恢复或重建。从这点也能看出操作账号文件时严谨程度要拉满改了之后一定要验证别改完就撒手。6. 实操演练与拓展方向建议6.1 从零搭建一个多用户权限环境光看不练等于白学最后我留一套演练实操给你自己动手建议在虚拟机里做因为你需要完整的root权限。先在虚拟机里建4个用户dev1、dev2、dev3、ops11个组dev、1个组ops让前三个用户的主组是devops1的主组是ops。执行groupadd dev groupadd ops useradd -g dev -s /bin/bash dev1 useradd -g dev -s /bin/bash dev2 useradd -g dev -s /bin/bash dev3 useradd -g ops -s /bin/bash ops1给每个用户设密码for u in dev1 dev2 dev3 ops1; do echo 123456 | passwd --stdin $u done如果没有--stdinUbuntu换成echo user:123456 | chpasswd。再创建一个共享工作目录/srv/project设置属组为dev并打开SGIDmkdir /srv/project chown root:dev /srv/project chmod 2775 /srv/project然后分别用dev1和ops1登录在目录里尝试创建文件观察文件属主属组区别。你会看到dev1创建的文件属组是dev而ops1创建的文件属组是ops。最后把ops1加进dev的附加组再测试一次你会体会到组管理的灵活性。6.2 密码策略与账号安全加固清单结合chage和PAM把一台新服务器的用户密码策略一次性加固到位以下清单可直接参考修改/etc/login.defs设置PASS_MAX_DAYS 90、PASS_MIN_DAYS 0、PASS_WARN_AGE 7对所有已存在用户执行chage -M 90 -W 7单用户覆盖用passwd -l锁定不常用系统账号如lp、sync、halt等检查/etc/sudoers里是否有能切换全站的万能账号如有且不再使用删除对应行对临时外包账号单独设-E到期日到期自动失效这一套做下来大多数等级保护审计的账户部分就说得过去了。再深入的话你可以研究PAM模块、SSH密钥登录方案、双因子认证这些进阶方向但底子始终是今天这些用户和密码管理命令。我个人在实际操作中的体会是用户管理和密码管理这块的内容别指望一遍背下来。命令多、参数杂但它有一个特点——基本全是查文件、改文件。只要把/etc/passwd、/etc/shadow、/etc/group三个文件彻底吃透所有命令的逻辑都能推出来。一次记不住就实际创建几个用户练手踩过一两次坑后面就顺了。这套功底打扎实后无论是往后学文件权限精细化控制还是做自动化批量建号脚本都会轻松很多。