ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Linux用户管理:删除用户、密码重置与su切换实战

2026/9/9 20:19:20 拓冰建站 浏览量
Linux用户管理:删除用户、密码重置与su切换实战 接手一台服务器最让人头疼的不是部署应用而是“人”的管理。尤其是离职员工账号清理、同事忘记密码找你重置、或者你想切到 root 执行一条命令却被系统拒绝。很多初学 Linux 的同学在这三个场景里反复踩坑删用户删不干净、改密码改出权限问题、su 切换后环境变量一团乱。这篇文章把 Linux 用户管理里最常见的三件事讲透删除用户、用户密码、su 切换用户。你可以把这篇当作一份“带判断的实操笔记”。下面所有命令都是在真实项目中经常用到的不是教科书里那种只能跑通最小示例的玩具命令。读完你会明白用户管理真正难的不是命令本身而是对 Linux 默认行为和权限边界有清晰认知。1. 这篇文章真正要解决的问题先说结论用户管理这个主题90% 的人问题不是不会敲命令而是不理解删除、密码、切换这三件事背后的关联。举三个真实场景场景一离职员工账号清理。你以为执行了userdel username就万事大吉结果发现服务器上/home/username目录还在里面躺着几 GB 的项目代码和配置文件。再查一下还有一堆nobody属主的文件。场景二同事忘了密码。你是服务器管理员需要帮同事重置密码。但如果你对/etc/shadow文件的权限结构不了解或者不清楚passwd和chpasswd在这种场景下有什么区别很容易给错权限。场景三切换到 root 执行命令。你输入su root系统直接提示su: user root does not exist或者su: inaccessible or not found。明明 root 用户就在/etc/passwd里为什么切不过去这三个场景分别对应本篇文章的三个核心命令userdel、passwd/chage、su。这篇文章的目标读者分三类刚入门 Linux 运维的开发者想把用户管理命令弄扎实。负责服务器日常维护的同学需要一套安全、可执行的用户清理流程。准备 Linux 运维面试的人需要理解命令背后的机制而不是背命令。读完这篇文章你能掌握三件事删除用户的三个层级以及如何清理残留文件。用户密码的设置、重置、锁定、过期策略。su与su -的本质区别以及切换失败的排查思路。2. Linux 用户管理的核心概念在敲命令之前建议先建立两个基础认知用户信息存在哪里以及 UID 和 shell 对用户管理的影响。2.1 四个关键文件Linux 用户信息不是存在“数据库”里而是存在几个文本文件中。用户管理的本质就是修改这几个文件的记录。文件作用典型内容/etc/passwd存储用户基本信息所有用户可读zhangsan:x:1001:1001::/home/zhangsan:/bin/bash/etc/shadow存储密码哈希和密码策略仅 root 可读zhangsan:$6$xxx...:19000:0:99999:7:::/etc/group存储组信息dev:x:1001:zhangsan,lisi/etc/gshadow存储组密码信息仅 root 可读dev:!::zhangsan,lisi用一条命令查看文件格式cat /etc/passwd重点看/etc/passwd的每一行它通常包含 7 个字段用冒号分隔用户名:密码占位符:UID:GID:备注:家目录:登录Shell对用户管理影响最大的是UID和Shell。2.2 UID 决定了用户的权限边界UID 就是用户 IDUser Identifier内核通过 UID 判断一个进程属于哪个用户以及这个用户的权限。UID 0root 用户超级管理员。UID 1-999系统用户或服务账户例如sshd、nginx、mysql。这些账户往往不需要登录所以 shell 一般是/sbin/nologin。UID 1000普通用户通常从 1000 开始分配。这也是为什么你用userdel删除一个用户后如果系统里还有该 UID 遗留的文件命令行里会看到这个文件的属主显示为一个数字因为系统里已经没有对应的用户名了。2.3 登录 Shell 决定了用户能否被 su每个用户在/etc/passwd的最后一列都有一个 Shell 字段。/bin/bash正常交互式 Shell可以登录可以用 su 切换。/sbin/nologin禁止登录 Shell。当你执行su username时如果目标用户的 Shell 是/sbin/nologin系统会提示该账号不可用或者直接切换失败。/bin/false相当于立即退出也是一种禁止登录的方式。这个细节特别重要。很多同学遇到su切不过去的问题第一反应是查密码其实先要查/etc/passwd里的 Shell 字段。2.4 用户管理命令的执行权限用户管理相关命令大致分为两类查看类命令id、who、last、finger普通用户也能执行。修改类命令useradd、userdel、passwd、su、chage通常需要 root 权限或者目标用户本人权限。在执行任何对用户有影响的操作前先用这条命令确认自己的身份id如果uid0说明你现在是 root可以继续如果不是 root删除用户、修改别人密码这些操作大概率会被拒绝。3. 用户密码管理passwd、chpasswd、chage密码管理是用户管理里最日常也最容易出错的部分。这里分三种场景讲。3.1 管理员重置普通用户密码如果你是 root想重置某个用户的密码直接执行passwd zhangsan系统会让你输入两次新密码成功后提示passwd: all authentication tokens updated successfully.这一步要理解两个重点普通用户没有权限修改别人的密码只有 root 可以。如果非 root 用户执行这条命令会提示passwd: Only root can specify a user name.passwd修改密码后会更新/etc/shadow中对应记录。比如原来 shadow 里的密码字段是$6$xxx开头的一串哈希修改后会变成新的哈希值。3.2 当前用户修改自己的密码如果当前登录用户想改自己的密码直接执行passwd注意不要带用户名。此时系统会先要求输入当前密码再输入两次新密码确认无误后更新。这里有一个安全细节Linux 的密码复杂度策略通常由/etc/pam.d/passwd和pam_pwquality模块控制。也就是说你设置一个过于简单的密码比如123456时即使你是 root也可能被策略拒绝。这也是很多同学在测试环境里经常遇到的坑。3.3 批量或自动化设置密码chpasswd在脚本中为多个用户设置密码passwd需要交互不太方便。更推荐用chpasswd。echo zhangsan:NewPass2025 | chpasswd也可以从文件读取chpasswd userlist.txtuserlist.txt的每一行格式为zhangsan:NewPass2025 lisi:AnotherPass2025这种写法适合批量初始化一批测试用户或者批量重置密码。注意安全性如果是在生产环境使用建议把文件权限设为 600并且用完删除。3.4 强制用户下次登录修改密码有些企业规范要求管理员初始化密码后用户第一次登录必须改成自己的密码。这用passwd -e或者chage -d 0实现。# 让密码立即过期强制用户下次登录时修改 chage -d 0 zhangsan执行后/etc/shadow中该用户的“最后一次修改密码日期”字段会变成 0表示密码已过期。用户下次用旧密码登录时系统会强制要求设置新密码。查看密码过期信息chage -l zhangsan输出类似Last password change : Jan 01, 2025 Password expires : Apr 01, 2025 Password inactive : never Account expires : never Minimum number of days between password change : 0 Maximum number of days between password change : 90 Warning days before password expires : 7这里能清晰看到密码策略。如果你希望某个账号永远不变密码可以设置chage -M -1 zhangsan-M -1表示密码不过期。3.5 锁定与解锁用户密码有时候不需要删除用户只是临时禁止登录可以锁定密码# 锁定密码 passwd -l zhangsan # 解锁密码 passwd -u zhangsan锁定的本质是在/etc/shadow的密码哈希前面加一个!前缀。当登录认证时系统发现哈希对不上自然就进不来了。这个原理可以帮助你理解为什么锁定密码不等于禁用账号用户如果已经登录当前会话不会被踢出。常用参数整理如下命令作用passwd usernameroot 重置指定用户密码passwd当前用户修改自己的密码passwd -l username锁定用户密码passwd -u username解锁用户密码passwd -e username强制用户下次登录修改密码chage -l username查看密码策略详情chage -M 90 username设置密码有效期 90 天chage -d 0 username强制下次登录改密4. 删除用户三个层级从轻到重删除用户是 Linux 用户管理里最容易“删不干净”的操作。很多初学者执行完userdel就以为任务完成实际上只是删了账号记录文件和进程还留在系统里。4.1 先搞清楚现状再动手删除用户前必须要做三件检查。第一确认用户基本信息id zhangsan输出示例uid1001(zhangsan) gid1001(zhangsan) groups1001(zhangsan)第二确认用户是否在线who | grep zhangsan如果有输出说明该用户正在登录直接删除会引发文件占用、进程残留等问题。可以用最后一个字段确认用户的登录终端然后考虑先通知用户退出或者由管理员强制杀掉会话。第三确认用户是否有进程在跑ps -u zhangsan如果输出非空需要先停掉这些进程否则用户删了进程还在运行文件清理会失败。4.2 第一层级只删除账号不删除数据userdel zhangsan这条命令做了什么它从/etc/passwd、/etc/shadow、/etc/group等文件中删除了账号记录但不会删除/home/zhangsan家目录/var/mail/zhangsan或/var/spool/mail/zhangsan邮件文件用户拥有的其他文件很多入门资料告诉你userdel是“删除用户”但实际效果只是“停用并且从系统数据库移除用户记录”。如果你希望清理数据需要额外执行删除命令。4.3 第二层级删除账号并清理家目录userdel -r zhangsan这里的-r表示remove意思是同时删除用户的家目录和邮件池mail spool。这是日常运维中比较常用的删除方式。但要注意即使加了-r也不会删除用户在其他目录下创建的文件。举个例子zhangsan 可能在/data/project/zhangsan_tmp下创建了临时文件或者在/tmp下留下文件这些不会被userdel -r一并清理。4.4 第三层级彻底清理如果你需要彻底清理一个用户的所有痕迹建议按下面的顺序操作。# 1. 锁定用户防止删除过程中有新的登录 passwd -l zhangsan # 2. 终止该用户所有进程 pkill -u zhangsan # 3. 删除用户的 crontab 计划任务 crontab -r -u zhangsan # 4. 删除用户及其家目录 userdel -r zhangsan # 5. 查找系统中该用户遗留的文件 find / -nouser -ls 2/dev/nullfind / -nouser -ls的作用是找出系统中属主已经不存在的文件。因为在删除用户后文件的属主 UID 可能仍然存在比如 1001但用户名已经不存在。当find用名字解析看不到对应的用户时会把这些文件判定为nouser。如果找到残留文件可以确认一下是否还需要保留然后手动处理。通常的做法是# 查看 UID 1001 的残留文件 find / -uid 1001 -ls 2/dev/null # 确认不需要后删除 find / -uid 1001 -delete 2/dev/null这里要特别提醒find / -delete风险极高执行前务必先确认找到的文件列表。更稳妥的做法是先用-ls确认再手动删或者在测试环境验证。4.5 删除用户时的三个坑坑一删除使用中的用户。如果用户在线userdel会报错userdel: user zhangsan is currently used in process 12345解决办法是先结束会话和进程再重新删除。不建议一上来就加-f强制删除因为强制删除会留下大量无法清理的孤儿文件。坑二家目录路径不是默认路径。有些用户创建时通过useradd -d /data/home/zhangsan指定了非标准家目录userdel -r会删除这个指定路径。但如果是手动创建的家目录不一定在/home下需要自己确认。坑三用户删除后 UID 可能被复用。Linux 系统不保证删除用户后该 UID 不会被新用户使用。如果之前有残留文件而新创建的用户恰好被分配到了同一个 UID就会发生新用户莫名“继承”旧文件的情况。所以彻底清理残留文件很重要。5. su 切换用户最常见的命令最容易被误解的细节su是 switch user 的缩写。看起来就是“切换用户”实际使用中有几个细节直接决定了你能不能切成功、环境变量对不对。5.1 su 与 su - 的区别很多初学者以为su zhangsan和su - zhangsan没区别其实区别非常大。# 切换用户但保留当前环境变量 su zhangsan # 切换用户并模拟完整登录加载目标用户的环境变量 su - zhangsan用例子验证# 当前是 root工作目录 /root su zhangsan pwd # 输出仍然是 /root不是 /home/zhangsan echo $HOME # 输出仍然是 /root exit # 换成 su - 登录 su - zhangsan pwd # 输出 /home/zhangsan echo $HOME # 输出 /home/zhangsan原因在于su只切换用户身份不执行目标用户的登录脚本如/etc/profile、~/.bash_profile、~/.bashrc所以环境变量不会变化。而su -模拟了重新登录的过程会加载完整的环境变量、PATH、工作目录。在实际运维中如果你希望切换到目标用户后能用它的完整环境比如用它的 Python 环境、Java 环境、crontab 配置必须用su -。5.2 切换到 root 与切换到普通用户的密码规则su的密码规则是很多人混淆的地方。从普通用户切换到 root需要输入 root 密码。从 root 切换到普通用户不需要输入密码。从普通用户切换到另一个普通用户需要输入目标用户的密码。这也是为什么有些同学在 root 下执行su zhangsan没有提示输入密码但作为普通用户执行su root却被要求输入密码。补充一个常见问题如果服务器不允许直接用 root SSH 登录那么合理的操作路径是先用普通用户登录再通过su -切换到 root。前提是普通用户知道 root 密码并且系统没有在 PAM 配置中限制 root 切换。5.3 非交互执行命令su -c如果你只是想以另一个用户身份执行一条命令不需要进入交互式 Shell可以用-c参数。su - zhangsan -c whoami这条命令会模拟登录 zhangsan 用户然后执行whoami输出zhangsan。执行完自动退出。这个写法在脚本中很实用。比如你的发布脚本需要用deploy用户执行应用启动命令但当前登录是 rootsu - deploy -c /opt/app/start.sh5.4 su 切换失败的常见原因从实际排障角度看su切换失败一般有以下几个原因。现象可能原因su: user zhangsan does not exist用户真的不存在确认用户名拼写su: user zhangsan does not exist or not found用户不存在或 PAM 配置导致账号不可访问su: user root does not exist通常不会发生但如果/etc/passwd中 root 被误改可能出现su: inaccessible or not found目标用户的 shell 不存在或/etc/passwd里 shell 字段异常su: Authentication failure密码错误或账号被锁定su: Account is locked密码被passwd -l锁定shadow 中密码有!前缀搜索热词里有一条 “mumu模拟器 su: inaccessible or not found”这个问题在真机和模拟器环境里挺典型。它通常意味着/system/bin/su这个二进制文件不存在或者当前 shell 用户的 PATH 环境变量不包含 su 的路径。Linux 系统里的排查思路一样先确认which su能否找到命令再确认目标用户的 shell 是否可用。5.5 su 与 sudo 的关系谈到 su一定会引出 sudo。两者都能提升权限但机制完全不同su切换到目标用户需要目标用户密码。它改变的是整个 shell 的属主身份。sudo用当前用户的密码执行单条命令命令以 root 或其他授权用户身份执行。它不需要知道 root 密码。在实际项目中更推荐用 sudo 而不是 su。原因有三个sudo 可以精确到命令级别的授权比如只允许执行systemctl restart nginx。sudo 有完整的审计日志记录谁在什么时间执行了什么命令。sudo 不需要暴露 root 密码降低密码泄露风险。sudo 的权限配置在/etc/sudoers中一般用visudo编辑。# 允许 zhangsan 执行所有 root 命令无需密码 zhangsan ALL(ALL) NOPASSWD: ALL具体项目里建议遵循最小权限原则只给必要命令授权。例如# 允许 zhangsan 重启 nginx且不需要密码 zhangsan ALL(root) NOPASSWD: /usr/bin/systemctl restart nginx这样既能满足日常操作需求又不会把所有 root 权限都交出去。6. 综合实战从创建用户到安全删除的完整流程如果前面的概念都理解了现在可以串起来走一遍完整生命周期创建一个测试用户、设置密码、验证切换、最后安全删除。6.1 创建用户并初始化密码# 创建用户同时创建家目录和指定 shell useradd -m -d /home/zhangsan -s /bin/bash zhangsan # 初始化密码 passwd zhangsan-m表示创建家目录-d指定家目录路径-s指定登录 shell。6.2 强制用户首次登录修改密码chage -d 0 zhangsan再次查看密码策略chage -l zhangsan输出中Last password change应该显示为password must be changed或类似提示。6.3 验证 su 切换# root 切换到普通用户 su - zhangsan # 查看当前身份 whoami # 查看当前目录 pwd # 切回 root exit如果切换失败用以下命令确认用户配置是否正常grep zhangsan /etc/passwd grep zhangsan /etc/shadow id zhangsan6.4 安全删除用户# 1. 锁定用户 passwd -l zhangsan # 2. 确认进程和会话 ps -u zhangsan who | grep zhangsan # 3. 结束相关进程 pkill -u zhangsan # 4. 删除用户及家目录 userdel -r zhangsan # 5. 检查残留文件 find / -uid 1001 -ls 2/dev/null如果第 5 步有输出说明用户身份虽然删了但一堆文件还属于这个 UID。建议先确认文件内容再决定是迁移给其他用户还是删除。7. 常见问题与排查方法问题现象可能原因排查方式解决方案删除用户后家目录还在userdel未加-r参数执行ls -ld /home/zhangsan用userdel -r删除或手动rm -rf用户在线删除失败用户还有活跃会话或进程who,w,ps -u username通知退出结束后再删确认无进程后用userdel -f删除用户后许多文件属主变成数字文件 UID 没有对应用户名find / -nouser -ls确认无用后删除或chown给其他用户su: inaccessible or not found目标 shell 不可用或命令路径不对grep username /etc/passwd检查 shell 字段改为/bin/bash等有效 shell普通用户su root提示认证失败root 密码错误或 root 密码被锁定sudo passwd root重置root 重置密码后再切换切换后 PATH 不对找不到命令使用了su而不是su -执行echo $PATH对比使用su - username完整登录用户密码被锁定passwd -l加锁shadow 中密码带!grep username /etc/shadowpasswd -u username解锁密码太简单设置失败PAM 密码复杂度策略查看/etc/pam.d/passwd改复杂密码或调整策略8. 最佳实践与工程建议用户管理看着简单但在生产环境里一旦出错可能导致应用启动失败、数据文件无法访问、审计无从追溯。下面几条建议来自实际运维经验值得收藏。8.1 删除用户前先备份而不是先删除生产环境删除用户尤其是删除离开项目的同事账号时userdel -r非常危险。家目录里可能有代码、SQL 脚本、配置文件、证书这些不一定全部同步到了代码仓库。建议先备份tar czf /backup/zhangsan_$(date %Y%m%d).tar.gz /home/zhangsan然后锁定账号观察一段时间确认没有影响后再删除。如果服务器资源紧张也可以先把家目录移到备份盘。8.2 谨慎使用 userdel -f-f参数可以强制删除用户即使该用户当前还在使用系统。但强制删除的后果是该用户的进程无法正常终止、文件成为孤儿文件、系统可能残留不可控的进程状态。除非你有非常明确的把握和回滚方案否则不要一开始就用-f。8.3 用 sudo 替代 su缩小权限边界团队协作时如果每个人都用su -切到 root那么 root 密码会广泛传播审计日志也无法区分谁做了什么。更推荐的方案是每个员工有自己的普通账号。通过 sudo 授权执行必要命令。在/etc/sudoers中按命令级别授权。开启 sudo 日志记录。8.4 密码策略要提前定义使用chage为系统用户设置密码有效期、最短修改天数、过期警告天数# 密码有效期 90 天过期前 7 天提醒两次修改至少间隔 7 天 chage -M 90 -W 7 -m 7 zhangsan在/etc/login.defs中也可以统一设置新用户的默认策略。注意修改策略只影响之后创建的用户不影响已有用户。8.5 记录用户管理操作用户创建、删除、权限变更是重要操作建议在团队内部记录操作人、操作时间、变更内容和影响账号。如果是使用 sudo 的环境配置 sudo 日志# /etc/sudoers 中启用日志 Defaults logfile/var/log/sudo.log Defaults log_input, log_output这样可以追溯每个操作的历史出问题时不用靠猜。8.6 测试环境先行所有涉及生产环境的用户变更建议先在测试机或者容器里验证一遍命令的效果。尤其像chage -d 0、userdel -r、find / -uid N -delete这类命令在测试环境运行一次观察输出结果和对文件的影响再上生产。9. 总结与后续学习方向这篇文章围绕 Linux 用户管理的三个高频操作展开了详细拆解删除用户userdel和userdel -r的区别、删除前的检查和残留文件清理。用户密码passwd、chpasswd、chage的适用场景以及锁定、解锁、强制改密的原理。su 切换用户su与su -的本质区别、切换失败排查思路、与 sudo 的对比。建议你下一件事找两台 Linux 虚拟机或者云服务器把文章里的命令完整实操一遍。尤其要试一下userdel不加-r和加-r的差别以及su和su -切换后的pwd与$HOME变化。这两个点的体感差异远比看文档深刻。如果后续你想继续深入可以往这两个方向学/etc/sudoers的完整配置语法包括别名、默认项、命令组授权。PAM 认证模块对登录、su、sudo 的限制方式比如如何限制指定用户才能 su 到 root。用户管理表面上是几个命令本质上是对 Linux 权限模型的理解。权限边界清晰后续做系统加固、权限治理、账号审计都会顺很多。