干这行时间久了你会慢慢发现Linux 用户管理是最容易被低估的一门手艺。刚入行那会儿我在一台 CentOS 服务器上执行 useradd 建账号满心以为完事大吉结果登录时直接提示 shell 不存在家里目录也没生成折腾半天才反应过来是自己把 useradd 的默认行为理解错了。从那以后我意识到创建、删除与查看普通用户这套命令表面看是几行指令背后却是一整套用户数据库、权限边界和系统安全机制在撑着。本文不打算铺开讲所有命令手册只围绕普通用户的管理链路把底层原理、实操步骤和踩过的坑一次性讲透适合刚接触 Linux 的初学者也适合带着团队做运维、担心误操作翻车的老手。1. 还没动手前先读懂用户是怎么存在系统里的很多教程一上来就教 useradd、userdel但我在带人的时候总喜欢先让对方打开 /etc/passwd 看一遍。因为用户管理之所以经常出问题绝大多数是因为不清楚系统到底把用户信息存在哪、每一条信息又代表什么含义。1.1 /etc/passwd每个用户的一行档案/etc/passwd 是系统里最基础的用户档案文件每一行对应一个用户字段用冒号分隔一共七列。比如root:x:0:0:root:/root:/bin/bash webapp:x:1001:1001:Web Application:/home/webapp:/bin/bash按顺序解读用户名、密码占位符、UID、GID、注释信息、家目录、登录 shell。这里有个新手容易误会的点第二列显示 x大家以为密码就存这儿其实 x 只是占位符真正的密文在 /etc/shadow 里对普通用户不可读。读这个文件时我习惯重点关注 UID。通常 0 是 root1-999 是系统账户1000 及以上才是普通用户。这个划分不是绝对的不同发行版边界略有差异但大体逻辑一致。注释信息列容易被忽略但建议给每个新建用户写上用途比如负责数据分析的应用账号或临时项目协作账号半年后回来看就不会出现一堆名字相同、来历不明的用户。1.2 /etc/shadow密码真正躺着的地方/etc/shadow 里保存着加密后的密码字串和密码有效期策略普通用户无权读取。它的字段比 passwd 复杂每一列依次是用户名、加密密码、上次修改密码距 1970 年 1 月 1 日的天数、最小修改间隔天数、密码最长有效期、过期前警告天数、宽限期、账户失效日期、保留字段。我排查过期问题时最常用到的是第三块内容。比如执行chage -l username可以快速查看某个用户的密码过期时间、账号失效时间不需要手工去拆 shadow 文件。日常运维中如果收到密码过期提醒、用户突然登录不上优先查 shadow 里的过期策略而不是怀疑什么玄学问题。另外要记住密码字段不是普通明文而是用 sha512、bcrypt 等算法加密的散列值偶然拿到 shadow 文件也并不意味着能直接还原密码但可以通过暴力猜测字典来撞击。所以保护好这个文件的权限非常重要平时不要随便修改它的属主和 mode。1.3 /etc/group 与 UID/GID 的边界逻辑用户除了有 UID还必须有主属组 GID可以额外加入多个附加组。这些关系记录在 /etc/group 中每一行对应一个组包含组名、组密码占位符、GID、成员列表。创建普通用户时有个细节值得强调很多发行版的 useradd 默认会创建一个与用户名同名的私有组这是为了配合每个用户独立主组的安全模型。这样做的好处在于新用户创建的文件默认属于私有组组权限不会意外共享给其他人坏处是删除用户时如果没注意这个组会变成孤儿组残留下来。我看 /etc/group 时还会关注普通用户是否被加入了 sudo 组或 wheel 组。很多所谓权限混乱的事故本质上就是某个用户悄悄被加进了特权组或者反过来——管理员自以为删了用户其实该用户仍以组成员身份存在于系统里。用户管理从来不是单看 passwd 那么简单。2. 创建普通用户命令都有了为什么还总翻车创建用户是日常操作里频率最高的动作也是翻车率最高的动作。原因很现实useradd 在不同发行版、不同参数组合下的默认行为差异很大而你脑子里记的可能是某个特定环境下的标准姿势。2.1 useradd 的参数矩阵到底该带哪些选项先看一个最常被问的问题为什么执行 useradd zhangsan 之后/home 下面没有自动生成 zhangsan 目录这就要说到 useradd 的默认策略。在不少 Red Hat 系系统中useradd 默认只是个登记动作不会自动创建家目录需要显式加 -m 参数才会创建。而在另外一些发行版或定制系统里默认又会自动建家目录。为了避免踩坑我自己的习惯是创建用户时永远显式把关键选项写全useradd -m -d /home/zhangsan -s /bin/bash -c 张三的账号 zhangsan-m创建家目录并复制 /etc/skel 下的默认文件进去。-d指定家目录路径默认是 /home/用户名。-s指定登录 shell强烈建议给普通用户设成 /bin/bash 或 /bin/sh。-c备注说明方便后续管理。-u指定 UID适用于需要固定 UID 的场景。-g指定主组。-G指定附加组多个组用逗号分隔。如果图省事只写useradd zhangsan等于让系统按默认值自由发挥且不设置密码建出来的用户既没有家目录也无法登录更麻烦的是你很难第一时间察觉问题出在哪。2.2 系统用户与普通用户的区别藏在 -r 参数里有些场景下你要创建的不是给人用的账号而是给某个服务跑的账号比如 nginx、mysql、rabbitmq。这时候用useradd -r创建系统用户更合适useradd -r -s /usr/sbin/nologin rabbitmq-r表示创建系统账户UID 会落在系统保留区间同时默认不会创建家目录也不会在 /etc/shadow 里设置可登录的密码。配合 nologin shell这个账号只能用来启动服务进程无法直接交互登录安全边界清晰得多。我给服务建账号时还会顺手把家目录指向一个服务自己的目录比如/var/lib/rabbitmq并设置正确的属主。这样日志、数据、缓存都集中在业务目录下后续排查空间占用时非常方便。2.3 adduser 和 useradd到底选哪个很多教程两种命令混着讲但实际使用体验差异很大。useradd 是系统原生的底层命令参数自由但也容易漏参数adduser 在 Debian/Ubuntu 系是一个更友好的交互式脚本会一步步问你密码、姓名、房间号等信息自动创建家目录并设置默认 shell。如果是在 Ubuntu 上给普通员工开账号我个人推荐直接用 adduser省心且不易出错adduser lisi它会自动处理家目录、密码设置和 shell 选择。但在 CentOS/RHEL 系上adduser 通常只是 useradd 的符号链接交互式能力不同。所以要先确认发行版类型别拿着 Ubuntu 的 adduser 经验直接套到 CentOS 上。2.4 创建之后的三件套密码、策略、验证创建完用户并不意味着工作结束我习惯接着做三件事。第一步是设置密码或锁定密码。临时账号直接passwd zhangsan设置初始密码并要求首次登录强制修改如果是服务账号用passwd -l rabbitmq锁定密码避免有人尝试通过服务账户登录。第二步是设置密码策略chage -M 90 zhangsan表示 90 天后密码过期配合chage -W 7提前 7 天提醒。第三步是验证id zhangsan groups zhangsan ls -ld /home/zhangsanid看 UID/GID 是否落在预期区间groups看附加组是否符合预期ls -ld看家目录属主和权限。我见过太多人创建完用户不去验证隔了几天才发现家目录权限被 umask 搞成了 755其他用户都能随意读文件。2.5 批量创建用户的脚本化示范给几十个人开账号时逐条敲 useradd 效率太低。我更倾向用脚本配合标准输入批量处理把账号清单放在一个文本文件里每行格式为用户名:初始密码:备注while IFS: read -r u p c; do useradd -m -s /bin/bash -c $c $u echo $u:$p | chpasswd chage -d 0 $u done users.txtchage -d 0的作用是强制用户首次登录时立刻修改密码比直接告知初始密码更安全。这个脚本简化了很多逻辑但已经足够覆盖大多数批量开号的需求。等号开完再用awk -F: $31000 {print $1} /etc/passwd快速列出所有普通用户做核对。3. 查看普通用户读懂系统里谁是谁查看用户远不止 whoami 这么简单尤其是当你需要排查某个 UID 占用了大量文件谁还挂在服务器上哪些账号已经过期但还能登录这些问题时一套完整的查看链路比什么都管用。3.1 三把基础钥匙id、whoami、getentwhoami只能告诉你当前身份是谁适合登录后快速确认没有权限错位。id则能输出完整的 UID、GID 和所属组列表id zhangsan # uid1002(zhangsan) gid1002(zhangsan) groups1002(zhangsan),10(wheel)如果只想确认用户属于哪个组直接groups zhangsan。但要注意这个命令读的是 /etc/group 里的静态配置不代表用户进程当前的实时组身份后者可以用/proc/PID/status里的 Groups 字段查看。getent passwd username是我排查用户是否存在时最喜欢的命令因为它不只看 /etc/passwd还走系统 NSS 配置能把 LDAP、NIS 等外部目录里的用户也查出来。如果你所在环境接入了统一身份认证平台getent的返回结果才代表系统真正认识这个用户。3.2 看现在谁在线who、w、last、lastlog排查谁在服务器上我一般按现在、近期、历史三层去看。who当前登录会话简单直接。w比 who 多显示负载、登录时长、当前执行的命令适合判断有人在干什么。last -n 20最近登录历史包含重启记录能够发现异常登录来源。lastlog每个用户最近一次登录时间适合筛查哪些账号从来没登录过。w last -n 10 lastlog | grep -v Never logged in有些账号创建后长期未使用就是潜在的安全风险面。我通常每个季度会跑一次 lastlog专门把 never logged in 的普通用户列出来跟业务方确认是否还应该保留。这个动作成本很低但能避免僵尸账号被利用来横向移动。3.3 动态视角按用户追进程、追文件、追磁盘用户管理的难点不止在账号本身更在于账号在系统里留下的痕迹。排查进程占用时可以用ps -u zhangsan -f看这个用户跑的所有进程需要实时看 CPU/内存占用时在 top 里按下u再输入用户名就能只显示该用户的进程。追文件时用 find 更直接find / -user zhangsan -type f 2/dev/null这条命令能帮你找出所有属于某个用户的文件特别是在你准备删除用户之前必须先搞清楚他的文件都散落在哪些目录。磁盘占用同理du -sh /home/zhangsan看家目录大小再结合上面的 find 扫一遍 /tmp、/var 等容易遗漏的位置。4. 删除普通用户踩过的坑比命令本身多删除用户是重灾区。命令本身只有 userdel 三个字母但它在不同发行版上的默认行为差异、对文件和进程的处理方式足以让一个粗心的人把生产服务器搞出大事。4.1 userdel 的标准姿势以及 -r 参数的真实含义最基础的删除命令是userdel zhangsan这条命令只删除用户条目家目录、邮件 spool、临时文件一概不动。如果想连家目录一起删加-ruserdel -r zhangsan但注意-r通常只删除用户家目录和 mail spool不保证清理该用户在 /tmp、/var 等其他位置创建的零散文件。所以我删用户前会先跑一遍find / -user zhangsan把所有归属该用户的文件清单列出来确认哪些该删、哪些要移交别指望一条命令替你考虑周全。4.2 最容易翻车的三个删除事故先说我见过最多的情况用户正连着进程删除时报错user zhangsan is currently used by process 12345。这是系统在保护自己不允许带着活动文件的用户被直接移除。很多新手直接忽略了这条报错继续敲 userdel -f 强制删除结果用户条目没了进程还在跑孤儿进程继续以 UID 身份访问文件留下一个无法追溯归属的烂摊子。第二种情况是 UID 复用造成的权限错乱。删掉一个用户后系统留下了大量属于该 UID 的残留文件后来创建新用户时复用同一个 UID新用户就莫名其妙继承了旧用户全部文件的所有权。这种事情在脚本批量开账号时尤其容易发生恢复起来非常麻烦。第三种情况是误删系统账户。有些基础服务依赖特定 UID 或系统账号比如 nfsnobody、daemon、bin一旦手滑把系统用户删了相关服务轻则报权限错误重则直接起不来。删之前不确认这个用户是普通用户还是系统保留用户就是在拿生产环境开玩笑。4.3 删除一个正在跑服务的用户完整步骤我现在处理这类需求固定走一套安全流程供你参考。第一步锁定账号阻止新的连接和操作passwd -l zhangsan第二步确认并清理进程。先ps -u zhangsan -f查进程跟业务方确认可以停止后执行pkill -u zhangsan再复查一遍确认没有残留。第三步备份数据。把要保留的文件移动到公共目录或打包归档同时导出一份权限归属清单。第四步删除用户userdel -r zhangsan第五步扫描残留文件并用脚本或 chown 转移归属find / -user zhangsan 2/dev/null如果还有结果或删除或 chown 给接手的人。这套流程的核心是先停、再查、后删、终扫每一步都可以回退避免一锤子买卖。4.4 删错了怎么办恢复思路真要是手滑删错了用户也别慌但必须清楚一点恢复的重点不是恢复 shadow 里的密码而是恢复用户与文件、进程之间的归属关系。如果只是删除了 /etc/passwd 中的用户条目而家目录还在那可以重新 useradd 一个同名用户并指定相同 UID就能重新接管所有权如果 UID 已经被新用户占用那就更复杂了需要先处理新用户的 UID再用 chown 批量修正旧文件属主。最高效的恢复办法是依靠备份平时养成为 /etc/passwd、/etc/shadow、/etc/group 做定期备份的习惯删用户前也手动复制一份到 /root 下。我自己的习惯是在删用户前执行cp -a /etc/passwd /etc/passwd.bak再动手成本几乎为零但关键时刻能救命。5. 用户管理里那点风骨权限边界与日常安全前面聊的都是具体命令但 Linux 用户管理的真正精华在于权限边界的划分。普通用户之所以普通不是因为他们能力弱而是系统通过权限模型约束了他们的影响半径。日常管理那些账户本质上就是在维护这套边界。5.1 sudo给普通用户递钥匙的正确方式普通用户需要执行管理命令时不应该直接切到 root 去操作更不应该把 root 密码随意发给其他人。标准做法是用 sudo 赋权。修改 sudo 配置必须用visudo命令不要直接编辑 /etc/sudoers因为 visudo 会做语法检查避免你写错配置后把自己锁在门外。zhangsan ALL(ALL) ALL %wheel ALL(ALL) ALL第一行表示用户 zhangsan 可以在所有主机上执行所有命令第二行表示 wheel 组成员同样拥有完整 sudo 权限。这里的主机概念在单机上可能没感觉但现在很多人管理云服务器sudoers 里的主机名匹配要格外留意写错了权限可能不生效也可能意外放开更大范围。分发 sudo 权限的原则是最小化能用组管理就不要逐个加用户能限制命令就不要给 ALL。比如只允许某人重启数据库可以写成zhangsan ALL(ALL) /usr/bin/systemctl restart mysqld比直接给全量 sudo 安全得多。不过要提醒一句规则越细维护成本越高小团队环境建议保持分组管理的简洁方式重点盯住成员变化。5.2 密码过期与账户锁定别等出事了才处理账户安全里最容易被忽略的是过期策略。很多服务器上的普通用户密码是永不过期的于是密码一用就是三五年一旦泄露基本就是裸奔。统一设置策略时可以改 /etc/login.defs 里的 PASS_MAX_DAYS、PASS_MIN_DAYS、PASS_WARN_AGE 三组参数对新建用户生效对已有用户逐个用chage -M 90 zhangsan调整。查所有普通用户的密码状态用passwd -S或者chage -l。如果需要临时封禁一个账号有两个命令容易混淆passwd -l zhangsan在密码字段前加 !禁用密码登录。usermod -L zhangsan同样锁定密码但对已经登录的会话没有影响。真正想把一个用户赶下线需要配合pkill -u zhangsan杀掉会话。如果是长期不用的账号我更建议直接设置账户过期日期usermod -e 2025-12-31 zhangsan到期后账号自动失效不需要人肉记着去封禁。5.3 服务账户的正确打开方式生产服务器上有很多用户根本不是人而是给 nginx、redis、rabbitmq 这类服务使用的系统账户。给服务账户赋权限时的思路和普通用户完全不同。服务账户不应该有可交互的 shell统一设置为/usr/sbin/nologin或/bin/false这样即使账号被猜到也无法登录执行命令。服务账户的家目录如果业务有需要就直接指向服务自己的工作目录并设置严格权限比如 700 或 750避免其他用户读取业务数据。最好把服务账户也纳入监控名单当发现一个本该 nologin 的账号有登录记录时基本就是入侵信号了。我看到热词里有rabbitmq 管理界面能用 admin 用户创建虚拟主机时连不上服务器这类问题其中相当一部分就是服务账户权限配置不到位比如启动服务的系统账户对 /etc/rabbitmq 目录没有读权限或者日志目录属主不对导致写入失败。排查这类问题时第一件事先确认服务由哪个系统账户启动再结合进程、目录属主和 sudoers 一起看往往能比在应用层 debug 更快定位。5.4 一份防翻车的用户管理操作清单最后整理一份我实际执行过的检查清单适合贴到运维文档里创建用户时显式指定 -m、-s、-c 参数不靠默认值。服务账户统一 nologin密码锁定。删除用户前先备份 /etc/passwd、/etc/shadow、/etc/group。删除用户前先跑 find / -user 用户名确认文件清单。删除用户前先 pkill 掉对应进程避免孤儿进程。用户删除后立即扫描残留文件不让 UID 复用成为隐患。定期用lastlog | grep -v Never logged in和 UID 范围检查普通用户数量。sudo 权限用组管理改完配置用 visudo -c 做语法检查。我也提一句环境差异的小结主流发行版里Debian/Ubuntu 用 adduser 更稳CentOS/RHEL 系用 useradd 更惯例国产 Linux 发行版大多兼容这两套体系命令本身基本一致主要差异在包管理器和默认 shell 上。如果你管理的是装有 LVM、云电脑这类虚拟化环境的机器创建用户后如果家目录放在数据盘逻辑卷上记得删用户或重装前先确认文件系统是卸载状态否则挂载点变动容易造成家目录数据错乱。这些都是我在实际环境里踩过的边角写出来希望能帮你少绕几步弯路。