接手一台服务器,最让人头疼的不是部署应用,而是“人”的管理。尤其是离职员工账号清理、同事忘记密码找你重置、或者你想切到 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 就是用户 ID(User Identifier),内核通过 UID 判断一个进程属于哪个用户,以及这个用户的权限。
UID 0:root 用户,超级管理员。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如果uid=0,说明你现在是 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:NewPass@2025" | chpasswd也可以从文件读取:
chpasswd < userlist.txtuserlist.txt的每一行格式为:
zhangsan:NewPass@2025 lisi:AnotherPass@2025这种写法适合批量初始化一批测试用户,或者批量重置密码。注意安全性:如果是在生产环境使用,建议把文件权限设为 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 username | root 重置指定用户密码 |
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输出示例:
uid=1001(zhangsan) gid=1001(zhangsan) groups=1001(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用户执行应用启动命令,但当前登录是 root:
su - deploy -c "/opt/app/start.sh"5.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/shadow | passwd -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 权限模型的理解。权限边界清晰,后续做系统加固、权限治理、账号审计都会顺很多。