
Linux 用户管理是系统运维的基础功也是 Linux 面试题里出现频率最高的内容之一。删除用户、用户密码、su 切换用户这三个操作几乎每天都会用到离职员工要删账号、新同事要开权限、临时切换身份去改配置、批量初始化服务器密码。这篇教程就把这三块内容一次性讲清楚核心命令是userdel、passwd、su每个命令都会拆开讲语法、参数、实际操作和常见报错。文章里所有示例命令都基于常见 Linux 发行版如 Ubuntu、CentOS的默认环境你可以直接复制到自己的测试机或虚拟机上跑一遍。如果你正在整理 Linux 运维笔记或准备面试这篇内容可以直接作为参考材料。1. 核心能力速览能力项说明涉及命令userdel、passwd、chpasswd、su、id、whoami、pkill主要场景删除系统账号、设置与重置用户密码、临时切换用户身份执行命令操作对象普通用户账号、root 账号、用户家目录、邮件池文件、用户组关键概念UID/GID、用户家目录、环境变量、登录 Shell、密码过期策略适用人群Linux 初学者、运维工程师、准备 Linux 面试的开发者注意事项删除用户前确认用户是否登录、是否有未迁移文件、是否拥有后台进程这三个操作的难度都不高但坑很集中userdel删不掉已登录用户、passwd权限不足、su -和su切换后环境变量不一致。下面逐个解决。2. 删除用户userdel 命令详解userdel用于删除系统用户账号基本语法userdel [选项] 用户名常用选项有三个选项作用-r删除用户的同时删除用户家目录和邮件池-f强制删除即使该用户已登录系统-Z删除用户时同时移除 SELinux 用户映射SELinux 环境下使用不接任何选项直接执行只删除账号本身保留家目录里的所有文件。2.1 保留家目录删除用户sudo userdel user01执行后/etc/passwd里不再有这个用户的条目但/home/user01目录仍然存在。这种方式适合需要保留用户历史数据、备份资料、网站代码的场景。删除前先在/home目录下确认要保留的数据再决定是否手动迁移。查看用户是否已被删除id user01如果输出no such user说明账号已经删除成功。2.2 删除用户及其家目录sudo userdel -r user01-r参数会同时清理用户的家目录和邮件池。家目录默认是/home/user01邮件池通常在/var/spool/mail/user01或者/var/mail/user01。执行后确认ls -ld /home/user01 ls -l /var/spool/mail/user01两个路径都不存在说明清理干净了。这个参数的优势是一次性搞定但风险也高如果用户目录里有需要保留的项目代码、数据库备份或业务数据删除后恢复成本极高。生产环境使用-r前必须有备份确认流程。2.3 强制删除已登录用户userdel默认不会删除已登录用户系统会提示user user01 is currently used in process.处理思路是先踢掉用户相关进程再删除账号。pkill -u user01 sudo userdel -r user01如果仍然提示用户在线说明还有进程未被清理查看用户相关进程ps -u user01确认残留进程后杀掉再删除sudo kill -9 PID sudo userdel -r user01另一个方式是用-f强制删除sudo userdel -rf user01-f虽然能直接删掉但可能留下残留的进程文件、目录属主变得异常。生产环境不建议优先使用-f更稳妥的做法是先终止用户进程再执行删除。2.4 删除用户的常见错误处理错误1删除用户时提示家目录不存在userdel: cannot remove /home/user01, not owned by user01这种情况多数是家目录属主异常或者路径被手动修改过。可以先检查ls -ld /home/user01确定目录确实无用后先删除用户再手动清理目录sudo userdel user01 sudo rm -rf /home/user01错误2系统提示该用户属于某个组userdel不会自动移除用户的私有组。删除用户后检查用户组是否残留cat /etc/group | grep user01如果私有组还在用groupdel清理sudo groupdel user01生产环境删账号后建议顺手检查/etc/passwd、/etc/shadow、/etc/group三个文件确保没有残留引用。2.5 批量删除用户思路批量删除时可以结合文本文件和循环脚本。准备一个users.txtuser01 user02 user03执行循环for user in $(cat users.txt); do sudo userdel -r $user echo Deleted: $user done脚本里建议先做一次id $user判断避免对不存在的用户执行删除时报错。更稳的写法for user in $(cat users.txt); do if id $user /dev/null; then sudo userdel -r $user echo [OK] $user else echo [SKIP] $user not found fi done3. 用户密码管理passwd 命令详解用户密码是 Linux 权限体系的第一道门。passwd命令负责密码的设置、修改、锁定和解锁。3.1 passwd 基本语法passwd [选项] [用户名]root 用户可以给任何用户设置密码普通用户只能修改自己的密码# 修改当前用户密码 passwd # root 为指定用户设置新密码 sudo passwd user01设置密码时终端不会显示输入内容这是正常现象不是键盘坏了。输入两次一致后提示passwd: password updated successfully即为成功。3.2 用 chpasswd 批量设置密码如果有多台服务器要初始化用户密码passwd一条一条敲太低效用chpasswd更合适。echo user01:MyNewPass123 | sudo chpasswd批量处理# 格式为 用户名:密码 while IFS: read -r username password; do echo $username:$password | sudo chpasswd echo Password updated for $username done passwords.txtpasswords.txt内容示例user01:Passw0rd2026 user02:Str0ngPass! user03:Admin123批量设完密码后检查用户是否能正常认证su - user01 -c echo login ok3.3 锁定与解锁用户锁定用户后即使密码正确也无法登录。# 锁定用户 sudo passwd -l user01 # 解锁用户 sudo passwd -u user01 # 查看用户密码状态 sudo passwd -S user01-S输出中L表示用户已锁定。P表示用户密码正常。NP表示用户尚未设置密码。锁定用户的另一种方式是手动修改 shadow 文件但这属于底层操作整体风险较高日常运维用passwd -l就够了。3.4 删除用户密码sudo passwd -d user01删除密码后用户登录时不需要输入密码或者在某些登录配置下直接无法登录具体行为取决于 SSH 和登录管理器配置。这个操作要慎用一般用于测试环境或临时要求的免密登录生产环境不推荐。3.5 密码过期与修改期限Linux 面试题里经常问密码过期策略。用chage管理用户密码有效期# 查看 user01 的密码到期信息 sudo chage -l user01 # 强制 user01 下次登录时修改密码 sudo chage -d 0 user01 # 设置密码最长有效期为 90 天 sudo chage -M 90 user01设置密码期限后/etc/shadow里的对应字段会发生改变。查看sudo cat /etc/shadow | grep user01密码相关字段说明字段含义第1字段用户名第2字段加密后的密码!或*开头表示锁定第3字段密码最后一次修改时间距 1970-01-01 的天数第4字段最短修改天数第5字段最长有效天数第6字段提前警告天数第7字段宽限天数第8字段账号过期时间如果 user01 忘记密码且 root 也无法直接通过su切换到该用户哪怕是 root大概率是 shell 被改成 nologinsudo usermod -s /bin/bash user01usermod和userdel一样都属于用户管理核心工具后文会配合使用。4. su 切换用户su命令用于临时切换用户身份以及执行指定身份下的命令。4.1 su 和 su - 的区别这是 Linux 面试经典问题。# 切换用户但不加载目标用户的环境变量和 Shell 配置 su user01 # 切换用户同时模拟该用户完整登录环境 su - user01命令执行差异直观体验whoami # 输出当前用户 su user01 whoami # 输出 user01但 $HOME 还是原用户的 echo $HOME # 结果取决于是否使用 su -root 切换到其他用户不需要输入密码普通用户切换到其他用户或切换到 root 则提示输入目标用户密码。su与su -的系统差异主要在于su用当前用户的环境变量加载的是非登录式 Shell。su -会完整读取目标用户的.bash_profile、.bashrc等文件切换更干净推荐在命令行交互时使用。排查环境变量不生效时优先确认是不是用了只有su没有su -。4.2 用 su -c 执行单条命令如果不希望进入交互式 Shell只想以另一个用户身份执行某条命令用-c参数# 以 user01 身份执行 whoami su - user01 -c whoami # 以 user01 身份运行脚本 su - user01 -c /home/user01/deploy.sh # 切换 root 执行一条命令 su - root -c systemctl restart nginx这在自动化脚本里很常用既避开了交互式切换也能固定执行身份。注意su - user01 -c的命令要写在双引号内如果命令本身包含特殊字符注意转义规则。脚本中执行时应当做引号嵌套测试。4.3 su 在脚本中的常见写法自动化部署脚本里经常看到这种方式#!/bin/bash # 以 appuser 身份执行应用启动脚本 su - appuser -c cd /opt/app ./start.sh # 多个命令合并 su - appuser -c source ~/.bashrc cd /opt/app ./start.sh 如果切换用户时提示su: user appuser does not exist先检查用户是否真的存在id appuser如果提示su: cannot set user id: Invalid argument可能是/etc/passwd权限或属主被误改这类问题不适合在现场临时硬修应该先恢复系统配置再从测试数据排查。4.4 su 切换用户与 sudo 对比面试题常见su和sudo有什么区别对比项susudo认证方式输入目标用户密码输入当前用户自己的密码权限范围一次性完全切换用户身份通过/etc/sudoers精确授权审计能力弱切换后所有命令都是目标用户身份强sudo 会记录执行命令推荐场景临时切换用户、单机调试日常管理、服务器多人协作日常建议优先使用sudo需要长期切换身份时再考虑su。两者配合使用的原则运维人员应有独立的 sudo 授权而不是直接共享 root 密码。需要身份归一化运行服务时才使用su切换到专用账号。执行危险命令前预先用whoami确认当前身份。5. 综合示例完整用户生命周期操作下面是一个从创建用户到删除用户的完整流程适合在测试机或虚拟机里一次性跑通用于验证前面所有命令。5.1 创建用户并设置密码# 创建用户 sudo useradd -m -s /bin/bash devops01 # 设置密码 echo devops01:Init123456 | sudo chpasswd # 锁定初始密码并强制下次修改 sudo chage -d 0 devops01 # 验证用户 id devops015.2 切换用户测试# 切换到 devops01 并查看环境变量 su - devops01 whoami echo $HOME exit这个流程验证后得到结论whoami返回 devops01$HOME输出/home/devops01说明切换成功且加载了目标用户环境。5.3 以用户身份执行命令# 创建测试文件 su - devops01 -c touch /home/devops01/test.txt # 查看文件属主 ls -l /home/devops01/test.txt预期结果文件属主显示devops01说明命令确实以该用户身份执行。5.4 删除用户确认不需要继续保留后执行删除# 登录用户踢出 pkill -u devops01 || true # 删除用户及家目录 sudo userdel -r devops01 # 验证 id devops01 || echo user devops01 removed ls -ld /home/devops01 || echo home dir removed完整跑完这一套流程userdel、passwd、su三个命令的最常见用法就都覆盖到了。6. 用户管理常见问题排查问题现象可能原因排查方式解决方案userdel提示用户已登录用户会话或残留进程未清理who、ps -u 用户名先pkill再执行删除或确认进程后userdel -f删除用户后家目录还在没有使用-r参数ls -ld /home/用户名手动确认后sudo rm -rf删除用户后提示组残留私有组未被清理cat /etc/group | grep 用户名sudo groupdel 组名passwd修改失败提示密码太短系统密码强度策略限制查看/etc/pam.d/中密码策略配置设置符合强度要求的密码或按规范调整 PAM 策略密码正确但无法切换shell 被改为 nologin 或账号锁定sudo chsh -s /bin/bash 用户名、sudo passwd -S 用户名修改 Shell 或解锁账号su -切换后命令找不到环境变量未正确加载echo $PATH使用su -完整登录或手动source初始化脚本su认证失败目标用户密码错误或用户被锁定sudo passwd -S 用户名用 root 重置密码后再切换删除用户时提示家目录属主异常目录 UID/GID 与用户不匹配ls -n /home/用户名修正属主或手动清理目录批量设置密码后部分用户无法登录密码文本格式错误或包含非法字符检查passwords.txt格式确保每行用户名:密码正确无误排查时一个关键原则所有用户操作前先通过id、whoami、cat /etc/passwd、cat /etc/group确认当前系统状态不要上来就执行删除或修改命令。7. 最佳实践与安全建议7.1 删除用户前要检查的事项生产环境删除用户前按这个顺序检查用户是否登录who | grep 用户名。用户是否有后台进程ps -u 用户名。家目录是否有待迁移数据du -sh /home/用户名。是否有定时任务crontab -u 用户名 -l。是否有系统服务或脚本引用该用户。确认以上内容后再决定用不带有-r参数的userdel还是手动迁移数据后清理目录。如果想彻底清理用户和相关数据下面这段流程更稳妥# 1. 终止用户所有进程 pkill -u appuser sleep 2 # 2. 删除用户家目录保留数据用 -r 参数则自动删除 sudo userdel -r appuser # 3. 清理用户私有组 if getent group appuser /dev/null; then sudo groupdel appuser fi # 4. 检查残留 getent passwd appuser || echo passwd cleaned getent shadow appuser || echo shadow cleaned getent group appuser || echo group cleaned ls -ld /home/appuser 2/dev/null || echo home cleaned7.2 密码管理安全要点root 密码、普通用户密码都不应该明文写在代码仓库里。批量初始化密码后立即提醒用户在首次登录时修改。开启chage -d 0强制登录修改密码的机制。密码锁定时优先使用passwd -l而不是直接改/etc/shadow。密码过期策略要与安全管理制度联动常用参数chage -M 90 -m 7 -W 14 用户名。推荐的一行初始化新用户命令sudo useradd -m -s /bin/bash newuser \ echo tempPass123 | sudo passwd --stdin newuser \ sudo chage -d 0 newuser其中--stdin参数在 Debian/Ubuntu 上可能不可用Debian/Ubuntu 环境请改用echo newuser:tempPass123 | sudo chpasswd sudo chage -d 0 newuser7.3 su 与权限管理建议root 密码不要直接共享给多人改用sudo授权。自动化脚本里使用su时用su - 用户 -c固定执行身份不进入交互 Shell。需要长期以另一个用户身份工作时推荐sudo -iu 用户替代su - 用户。排查环境问题时纯手工场景建议使用su -完整加载登录环境。7.4 用户管理的日常审计建议保存操作记录# 查看最近登录记录 last # 查看当前登录用户 who # 查看所有用户 cat /etc/passwd # 查看用户组信息 cat /etc/group涉及删除用户、修改用户密码、批量设置密码等操作尽量使用带日志的 junction 操作方式。比如通过sudo执行并保留日志或者在关键操作后立即把输出写入日志文件sudo userdel -r appuser | tee -a /var/log/user_manage.log8. 总结与后续学习方向这篇内容围绕 Linux 用户管理的三个高频操作展开userdel删除用户掌握-r、-f参数差异清理家目录、邮件池和私有组批量删除脚本要加用户存在性判断。passwd用户密码掌握passwd -l、passwd -u、passwd -d和chpasswd批量操作生产环境初始化用户时配合chage -d 0强制首次登录改密。su切换用户先记住su和su -的环境变量差异再掌握su - 用户 -c单命令执行方式自动化脚本中优先用sudo而不是共享 root 密码。最容易踩的坑有三个userdel不加-r删不干净、su不带横杠导致环境变量异常、批量设置密码脚本没有先判断用户是否存在。这三个坑在真实环境中出现的频率很高。后续可以继续学习usermod修改用户属性锁定用户、追加附加组、修改家目录路径。useradd的默认配置/etc/default/useradd、/etc/login.defs里设置 UID 范围、密码过期策略、家目录权限。PAM 密码策略/etc/pam.d/common-password或/etc/security/pwquality.conf控制密码复杂度。SSH 远程用户管理查看/var/log/auth.log或/var/log/secure跟踪用户登录和 su 切换记录。建议把上面综合示例的完整流程在虚拟机里跑一遍跑通后再扩展到批量用户处理。这些命令不需要背做多了自然就记住了。