资讯详情

Linux用户管理实战:从/etc/passwd文件到正则匹配

📅 2026/10/18 3:26:34 | 华诺云谱 👁 阅读
Linux用户管理实战:从/etc/passwd文件到正则匹配
我刚接触Linux那会儿最喜欢翻的两个目录是/etc和/home。一个装着系统的命根子配置一个装着所有用户的小窝。后来带过几个新人发现大家最容易懵的也是这两个地方——尤其是/etc/passwd这个文件乍一看就是一堆冒号分隔的乱码但只要你搞懂了它Linux的用户管理体系基本就通了半边天。这篇文章我就把第8集的内容串起来聊聊从/etc目录讲到Shell切换再到用户组管理和正则匹配全是实操里反复用到的东西。1. 从/etc目录谈起先搞清系统的灵魂目录到底装了什么1.1 为什么/etc值得你花时间仔细看一遍/etcETCetera的缩写意思是等等其他可以说是Linux系统里最重要的配置目录。你平时改IP地址、配DNS、设置开机自启、管理用户密码最终落地的文件几乎都在这里。很多新手出问题根子就在于不知道配置文件在哪、格式是什么、改完要不要重启服务。我习惯把/etc下的文件分成三类系统级配置比如/etc/fstab开机挂载分区、/etc/hosts本地域名解析、/etc/resolv.confDNS配置、/etc/sysctl.conf内核参数服务与应用配置比如/etc/ssh/sshd_config、/etc/nginx/nginx.conf、/etc/crontab定时任务用户与认证信息今天的主角/etc/passwd、/etc/shadow、/etc/group其中用户管理这块核心是三个文件/etc/passwd存用户基本信息/etc/shadow存加密后的密码和密码策略/etc/group存用户组信息。这三个文件就是Linux用户体系的台账你用什么命令管理用户本质上都是在改这几个文件的内容。1.2 /etc/passwd的字段拆解冒号分隔的用户档案表/etc/passwd每一行代表一个用户用冒号分成7个字段。比如我随便写一行dev_user:x:1001:1001:Dev User:/home/dev_user:/bin/bash字段含义分别是字段位置含义示例值说明1用户名dev_user登录时输入的名字2密码占位符x真正密码在/etc/shadow里这是安全机制3UID1001用户ID0是root1-999通常是系统用户4GID1001用户的主组ID5注释信息Dev User一般是姓名或用途说明6家目录/home/dev_user登录后的起始目录7登录Shell/bin/bash登录后默认使用的Shell刚学的时候有个问题很容易忽略为什么密码字段是个x而不是一串加密字符串早期Unix确实把加密密码直接放在这个文件里但后来发现/etc/passwd是所有人都能读的把密码哈希放这里等于公开了攻击样本。于是就把哈希挪到了只有root能读的/etc/shadow里原位置留个x做标记。这个设计思路你品一品——权限最小化能不给权限就不给权限。2. Shell切换的几种姿势chsh、$SHELL变量与登录Shell的关系2.1 什么是登录Shell它和终端里敲命令有什么区别Shell就是你的命令解释器你在终端里敲的每一行命令都是交给它执行的。Linux默认的Shell通常是bash但也有很多人用zsh、fish。这里有个概念要分清登录Shell和非登录Shell。登录Shell你通过输入用户名密码登录系统时启动的Shell它会加载/etc/profile和~/.bash_profile这类全局级配置非登录Shell你在已登录环境里再开一个子Shell比如在bash里直接敲bash它主要加载~/.bashrc这就导致一个经典问题你改了~/.bashrc里的别名重新登录后却没生效。其实不是没生效而是登录Shell可能压根没读这个文件或者其它配置文件把你的设置覆盖了。要确认当前Shell类型可以看$SHELL变量和特殊变量$0echo $SHELL # 显示默认Shell路径比如/bin/bash echo $0 # 显示当前正在运行的Shell比如-bash/-zsh2.2 chsh命令永久切换默认Shell的正规方式临时切换Shell很简单直接敲对应的Shell名就行。但永久切换就要用chshchange shell了。新手最容易犯的错是直接改/etc/passwd里的最后一个字段手一抖写错路径下回登录直接进不去系统。用chsh能规避这个问题因为它会帮你检查Shell路径是否合法是否存在于/etc/shells里。chsh -s /bin/zsh执行完会提示你输入密码然后修改/etc/passwd里对应用户的Shell字段。改完重开终端生效用echo $SHELL验证。注意chsh只影响你当前登录用户想改其他用户就得sudo chsh -s /bin/zsh 用户名。这里有个实际工作中的场景我有一台服务器默认用/bin/sh的系统用户特别多但某天需要给某个服务账号切到bash来执行脚本当时就是用chsh -s /bin/bash 服务账号名完成的。改之前务必确认目标Shell已经装好了不然容易出现服务启动不了日志里报错找不到解释器的情况。2.3 /etc/shells的限制为什么有些Shell路径会被拒绝刚才提到/etc/shells这个文件里列出了系统认可的所有Shell路径。chsh会检查你指定的Shell是否在这个列表里不在就报错。设计这个机制的目的是防止你把登录Shell改成一些奇怪的程序比如改成/bin/ls那用户一登录看到的不是提示符而是一堆文件列表。所以当你编译安装了新Shell比如从源码安装zsh到/usr/local/bin/zsh记得先把它加进/etc/shells再chsh。提示修改/etc/shells要root权限加一行/usr/local/bin/zsh之后再执行chsh -s /usr/local/bin/zsh就顺了。3. 用户与组管理从useradd到usermod的完整实操链路3.1 useradd的默认行为为什么新建用户后没有家目录useradd是创建用户的命令但很多人上来就踩坑——新建完用户用su切过去发现提示no directory这才意识到没建家目录。原因在于不同发行版的useradd默认行为不一样。有些系统默认不创建家目录你需要显式加-m参数sudo useradd -m -s /bin/bash dev_user这条命令同时做了三件事创建名为dev_user的用户给它建家目录/home/dev_user指定登录Shell为/bin/bash。如果你还想指定UID/GID可以用-u和-gsudo useradd -m -u 1500 -g dev_group -s /bin/bash dev_user这里的-g指定的是主组primary group后面还能用-G指定附加组supplementary group。主组决定用户创建文件时默认的组归属附加组决定用户额外拥有哪些组的权限。两者别搞混实际运维里因为主组和附加组搞混导致权限无法预期的例子非常多。3.2 /etc/default/useradd和/etc/login.defs改默认配置比每次敲参数更省事如果你嫌每次创建用户都要敲一堆参数可以去改两个配置文件/etc/default/useradd定义默认家目录路径、默认Shell、默认的SKEL目录新家目录的模板来源/etc/login.defs定义UID/GID范围、密码过期策略、创建家目录的默认行为比如login.defs里有一项CREATE_HOME有些版本设成no这就是新建用户没有家目录的直接原因。改成yes就能让所有新用户默认有家目录不用每条命令都加-m。3.3 usermod用户信息调整的瑞士军刀用户建好之后调整信息就靠usermod。它的用法和useradd几乎一致只是把创建变成修改sudo usermod -l new_name dev_user # 改用户名 sudo usermod -u 2000 dev_user # 改UID sudo usermod -g dev_group dev_user # 改主组 sudo usermod -aG docker dev_user # 把用户加入docker组-a必须加否则会被移除原有附加组-aG里的-aappend特别关键。很多人在改附加组时忘记加-a结果用户从其他组里被踢出来了。我有一次就是把一个用户从sudo组里踢了对方半天登录不了管理后台排查了一会儿才发现是-G覆盖了原有组。记住修改附加组永远带上-a。3.4 userdel删除用户没那么简单删除用户用userdel但单纯执行userdel 用户名可能留下家目录和邮件目录。所以推荐用-r参数sudo userdel -r dev_user这个-r会同时删除用户的家目录和邮件池干净利落。不过有个细节要注意如果被删除的UID还被文件占用比如某个文件属主是这个UID但用户名已经删了那些文件就会显示成无主文件的数字ID。所以删除前最好先find / -user dev_user扫一下确认没有重要文件再动手。3.5 groupadd和groupdel组管理的基本操作组就是用户的集合用groupadd创建、groupdel删除sudo groupadd dev_group sudo groupadd -g 2000 dev_group # 指定GID sudo groupdel dev_group删除组之前要确认组里没有用户的主组指向它否则报错。实际操作中遇到这种报错得先用usermod -g把相关用户的主组改掉再来删组。查看用户属于哪些组用id命令或groups命令id dev_user groups dev_usergroups输出的是用户所属的所有组但注意它直接读/etc/group所以即时生效。而id显示的信息更全包括UID/GID和所有附加组排查问题我推荐id。4. passwd命令的隐藏技能与密码安全实操4.1 修改密码的基本操作和权限边界平时我们用passwd改自己的密码root能改任何人的密码。这里说几个不那么新手友好的用法passwd # 改当前用户密码 sudo passwd dev_user # root强制改指定用户的密码 sudo passwd -l dev_user # 锁定账号Lock sudo passwd -u dev_user # 解锁账号Unlock sudo passwd -e dev_user # 强制用户下次登录时改密码Expire sudo passwd -n 7 -x 90 dev_user # 设置密码最短使用7天最长90天-e这个参数在实际运维里非常有用。比如你给某个新员工开通账号初始密码设置完之后执行passwd -e对方第一次登录就被逼着改密码避免长期使用连你自己都知道的初始密码。4.2 /etc/shadow里那些冒号字段到底什么意思/etc/shadow也被冒号分隔但字段更多核心是这几项dev_user:$6$xxxx...:19000:7:90:7:30::字段含义说明1用户名对应/etc/passwd2密码哈希$6$开头是SHA-512算法3最后一次修改密码的时间从1970-01-01起的天数4密码最短使用天数0表示随时可改5密码最长使用天数99999表示永不过期6过期前警告天数7表示提前7天提醒7宽限天数密码过期后还能登录的天数8账号失效时间空表示永不失效9保留字段一般空着看懂这个文件你就能解释很多灵异现象。比如某天用户突然登录不了提示密码过期那多半是第5字段设了有效期时间到了又比如账号明明被锁了手动改/etc/shadow把密码字段前面加个!即可锁号passwd -l做得也是类似的事。4.3 批量处理密码chpasswd和expect场景如果有几十个测试用户要统一设密码别一个个passwd用chpasswdecho dev_user:NewPass123 | sudo chpasswd还可以配合文件批量处理sudo chpasswd users.txt文件格式同样是用户名:密码一行一个。这个命令在自动化脚本里尤其顺手但注意密码会出现在命令行历史里自己机器玩玩没问题生产环境建议配合密钥登录少用明文密码传递。5. 正则表达式用户管理场景下的实用匹配技巧5.1 为什么学用户管理一定要碰正则前面提到的/etc/passwd、/etc/group都是文本文件既然管理用户最终都是操作文本那就免不了要用正则去搜索、过滤、统计。举个最常见的场景我想找出所有UID大于1000的普通用户用grep加正则一条命令搞定grep -E ^[^:]:[^:]:(1[0-9]{3,}|[2-9][0-9]{3,}): /etc/passwd这个正则的意思拆开看^[^:]匹配行首连续非冒号字符用户名[^:]匹配密码字段(1[0-9]{3,}|[2-9][0-9]{3,})匹配1000以上的数字要么1000-1999要么2000以上。如果不用正则你得先cat /etc/passwd再肉眼找用户一多就废了。5.2 grep、egrep和正则符号速记先分清grep和egrep等价于grep -Eegrep支持扩展正则可以直接用、?、|、{}这些高级符号普通grep需要用反斜杠转义才能用麻烦还容易错。建议日常统一用grep -E。几个高频符号符号含义示例^行首^dev匹配以dev开头的行$行尾bash$匹配以bash结尾的行.任意单个字符a.c匹配abc/adc*前一个字符重复0次或多次ab*c匹配ac/abbc前一个字符重复1次或多次abc匹配abc/abbc但不匹配ac[]字符集[Dd]ev匹配Dev或dev[^]排除字符集[^:]匹配任意非冒号字符|或dev|test匹配dev或test{n,m}重复次数范围[0-9]{3,}匹配3位以上数字()分组(ab)匹配ab/abab5.3 实际案例用正则筛选需要清理的僵尸账号我前阵子接手一台服务器需要盘点哪些账号是垃圾账号。当时用了几条正则命令做筛选先找出所有登录Shell是/usr/sbin/nologin的账号这些一般是服务账号不能登录shell按理说不用清理grep -E /usr/sbin/nologin$ /etc/passwd再找出所有家目录在/home下但已经半年没登录的账号。登录时间得去lastlog看所以用lastlog配合awk处理lastlog -t 180 | awk {print $1} | grep -v -E ^(Username|root)$这里的-v是反向匹配排除表头和root。正则里^Username$精确匹配整行。最后用usermod把确认不用的账号锁掉sudo usermod -L 用户名整个过程下来正则不是炫技而是把文本处理的效率拉满。你想精准操作文本正则绕不过去。5.4 正则的常见陷阱贪婪匹配和转义问题新手写正则最容易踩两个坑。第一个是贪婪匹配。默认情况下*和是贪婪的会匹配尽可能多的字符。比如你用^a.*:匹配abc:def:它会匹配到最后一个冒号而不是第一个。想改成非贪婪在*或后面加?但要注意这个语法在grep -E里不一定支持得看版本。实战中我通常宁可把正则写得窄一点也懒得和贪婪较劲。第二个是转义。在/etc/passwd里冒号是分隔符你想匹配冒号本身没问题但如果你想匹配[或]这种正则符号就得加反斜杠转义。比如grep -E \[root\] /etc/passwd匹配字面上的[root]字符串。很多人在这里反复试错其实记住一点就行你想匹配的字符碰巧是正则元字符那就加\让它变回普通字符。6. 把这套知识串起来一个从零创建用户到配置环境的完整示例光讲命令太散了我带你把今天的内容串成一个真实场景。假设我现在要给一个来自某高校实验室的协作者开一个账号名字叫lab_user让他能用bash、能自己装软件把他加进sudo组同时限制密码90天过期。完整操作如下# 1. 创建用户并指定家目录和Shell sudo useradd -m -s /bin/bash -c Lab Collaborator lab_user # 2. 设置初始密码并强制首次登录修改 echo lab_user:TempPass2024 | sudo chpasswd sudo passwd -e lab_user # 3. 将用户加入sudo附加组 sudo usermod -aG sudo lab_user # 4. 验证用户信息 id lab_user grep -E ^lab_user: /etc/passwd这条链路跑完之后grep查到的结果就是一条标准的/etc/passwd记录。如果后续要删除这个账号一个sudo userdel -r lab_user就能收尾。这里再提醒一下userdel -r会删家目录当心客户数据。再看一个自动化场景。某次我需要给模拟项目X的20个临时用户批量重置密码密码统一为随机生成的串然后强制所有人下次改密码for u in $(cat user_list.txt); do echo $u:$(openssl rand -base64 12) | sudo chpasswd sudo passwd -e $u done这里用了openssl rand生成随机密码chpasswd批量写入最后强制过期。你看看这几条命令背后全都是今天讲的文件、命令和正则思路。7. 踩坑记录用户管理里的三个典型翻车现场写到最后我把自己见过也踩过的几个坑列出来。这些内容正经文档里很少细讲但实际运维碰到的概率很高。第一个坑手动改/etc/passwd导致系统登录崩溃。有一次图省事我直接用vim给某个用户的家目录路径加了个字结果多打了一个字母。用户那边完全登录不进去。后来用系统修复模式进去改回来的。所以改用户信息老老实实用usermod别手搓/etc/passwd。如果非要手改先把/etc/passwd备份一份cp /etc/passwd /etc/passwd.bak。第二个坑usermod -G把用户从sudo组踢出。这个前面已经提过但我愿意再说一次因为太典型了。当时我想把一个用户加入docker组用的是sudo usermod -G docker 用户名忘了加-a结果sudo组没了。幸亏机器上还有其他管理员账号local console还能救。教训就是写进肌肉记忆附加组操作永远-aG。第三个坑正则写错导致批量锁定账号。之前写清理脚本打算锁掉所有登录Shell为/bin/false的用户正则写成了grep -E /bin/false /etc/passwd结果把注释信息里带有false字样的用户也匹配进去了。幸好锁的是几位同事的测试号被念叨了好几天。从那以后我写这种批量操作都会先跑一遍grep单独查看匹配结果确认无误后再接usermod。宁可多敲一条命令也别批量误伤。8. 收尾一点实际使用后的体会这套内容学完之后我建议你把重点放在文件-命令-正则三者之间的关系上。命令记住了只能解决眼前事理解了/etc/passwd、/etc/shadow、/etc/group这几个文件的结构和字段含义遇到任何用户异常你都能顺着文本文件找到根因。正则更是给效率加buff的工具别怕写错多多debug自然就熟练了。后面我还会继续更新Linux基础系列的后续内容比如文件权限的深入剖析、环境变量加载顺序、systemd管理服务之类的。如果这篇文章对你有点帮助欢迎在评论区聊聊你踩过的用户管理相关的坑我每条都会看。
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑