ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Linux用户管理实战:userdel删除用户、密码策略与su切换问题解析

Linux用户管理实战:userdel删除用户、密码策略与su切换问题解析 最近在处理一台测试服务器时想清理一个已经离职同事的账号执行userdel时却被系统直接拒绝user testuser is currently used by process 1234换了一台机器用su切换到普通用户又碰到su: inaccessible or not found。这些看似基础的 Linux 用户管理操作一旦踩到细节很容易让新手卡住。这篇文章就围绕 Linux 用户管理中三个高频主题展开删除用户、用户密码管理、su 切换用户。内容会从核心概念讲起再给出命令语法、完整示例、常见报错和处理思路最后补充一些生产环境下的管理建议。无论你是刚开始学 Linux 的学生还是已经在维护服务器的后端开发者这篇文章都能帮助你建立更完整的用户管理知识体系。1. Linux 用户管理的核心概念1.1 用户账号与 UID 的关系Linux 是一个多用户、多任务的操作系统多个用户可以同时使用同一台服务器彼此之间通过文件权限、进程权限、用户身份来隔离。每个用户在系统中都有一个唯一的身份标识这个标识就是UIDUser Identifier。用户名是给人看的UID 是给系统用的。系统内部判断“某个文件属于谁”“某个进程由谁运行”最终都是看 UID而不是看用户名。你可以用id命令查看当前用户信息id输出示例uid1000(zhangsan) gid1000(zhangsan) groups1000(zhangsan),4(adm),27(sudo)其中uid1000(zhangsan)表示当前用户是 zhangsanUID 是 1000主组 GID 也是 1000。Linux 中的用户大致可以分为三类用户类型UID 范围说明root 用户0超级管理员对系统有最高权限系统用户1~999CentOS/RHEL/ 1~999Ubuntu 新版本服务于系统进程如 sshd、nginx、mysql 等普通用户1000 及以上不同发行版略有差异日常登录使用的用户权限受限1.2 用户信息存储在哪几个文件与用户管理相关的核心文件主要有三个/etc/passwd保存用户名、UID、GID、家目录、登录 Shell 等信息。/etc/shadow保存加密后的密码以及密码有效期等信息。/etc/group保存用户组信息。查看一个用户的 passwd 记录grep zhangsan /etc/passwd输出示例zhangsan:x:1000:1000::/home/zhangsan:/bin/bash字段顺序依次是用户名、密码占位符、UID、GID、用户描述、家目录、登录 Shell。这里看到的x表示密码不是明文存在 passwd 文件里而是转移到了/etc/shadow。密码字段则保存在 shadow 文件中sudo grep zhangsan /etc/shadowshadow 文件里的密码是经过哈希加密的字符串。普通用户没有权限读取该文件只有 root 或使用 sudo 才能查看。1.3 用户、组、权限之间的联动用户管理从来不是孤立操作。用户加入某个组后该组对应的文件访问权限就会对用户生效。比如把开发人员加入www-data组他就可能拥有 Web 目录的访问权把运维加入sudo组他就拥有执行高权限命令的资格。因此在删除用户之前要先意识到这个用户可能属于多个组、拥有多个文件、运行着多个进程。这也正是后面删除用户时要特别谨慎的原因。2. 环境准备与版本说明本文的命令适用于大多数主流 Linux 发行版包括CentOS / RHEL / Rocky Linux / AlmaLinuxUbuntu / DebianopenEuler、麒麟、统信 UOS 等国产 Linux 发行版不同发行版在用户管理命令上基本一致因为useradd、userdel、passwd、su等都是 Linux 标准命令。差异主要体现在用户 UID 起始值可能不同。删除用户时某些发行版会自动清理邮件池某些不会。Ubuntu 默认不允许直接用 root 登录需要搭配sudo。如果你的环境是纯命令行服务器直接通过 SSH 登录操作即可如果是虚拟机或云主机建议先拍快照或备份关键配置再执行涉及用户删除的实验。本文示例以常见环境为背景使用普通用户加sudo的方式演示重点展示命令思路和排错方法。你可以根据自己的实际环境调整细节。3. 删除用户的正确打开方式3.1 userdel 命令基础语法删除用户使用userdel命令基本语法userdel [选项] 用户名常用选项选项作用-r同时删除用户的家目录和邮件池-f强制删除用户即使该用户已登录或有运行中的进程举例说明。删除用户 zhangsan但保留家目录sudo userdel zhangsan这个命令会从/etc/passwd、/etc/shadow、/etc/group中移除用户信息但不会删除/home/zhangsan目录以及该用户拥有的文件。如果希望把用户和家目录一起删除sudo userdel -r zhangsan此时系统会自动删除/home/zhangsan目录。如果你明确知道该目录下没有需要保留的数据可以使用这种方式。3.2 为什么有时无法删除用户最典型的报错就是userdel: user zhangsan is currently used by process 1234这个错误说明用户 zhangsan 当前还有进程在运行或者用户仍然处于登录状态。Linux 不允许直接删除一个正在使用中的用户这是为了避免导致文件所有者和进程归属出现混乱。处理方法是先结束该用户的进程再执行删除。查看该用户的进程ps -u zhangsan强制结束该用户的所有进程sudo pkill -u zhangsan也可以先踢掉该用户的登录会话再清理进程sudo pkill -9 -u zhangsan然后再执行删除sudo userdel -r zhangsan如果系统仍然提示进程占用可以进一步通过pgrep -u zhangsan确认是否还有残留进程。对于非常顽固的会话需要检查ps -ef | grep zhangsan甚至可能需要重启相关服务后再删除。3.3 加上 -f 强制删除的隐患有些教程会告诉你用-f强制删除sudo userdel -f zhangsan使用-f后即使该用户还在登录状态userdel也会强制执行删除但这样会带来隐患正在运行的进程仍然会以这个已经删除的 UID 继续运行文件归属显示为“无主用户”。该用户当前占用的文件、临时目录不会被自动清理。如果进程后续创建文件这些文件的 UID 可能变成一个无法识别的大数字。所以-f是“最后手段”不应该是常规操作。在删除用户前先结束相关进程才是更安全的流程。3.4 删除用户后如何处理残留文件有时候设计上允许保留旧用户的文件用于数据仲裁或备份归档。例如只执行sudo userdel zhangsan/home/zhangsan目录会保留下来。你可以手动处理这些残留文件# 查看家目录是否还在 ls -ld /home/zhangsan # 归档后删除 sudo tar -czf /backup/zhangsan_home.tar.gz /home/zhangsan sudo rm -rf /home/zhangsan如果文件属于一个已经删除的用户ls -l显示的文件所有者可能是一个数字 UID。此时可以用find命令查找系统中属于旧 UID 的文件sudo find / -uid 1000 -type f 2/dev/null这里需要先确认旧用户的 UID 是多少然后根据 UID 查找。找到后逐项确认是否需要保留。3.5 删除用户、组的综合判断删除用户不只是删除用户名本身。该用户此前可能拥有计划任务例如sudo crontab -u zhangsan -r该用户可能有正在运行的 systemd 用户服务如果开启了用户级 systemdsudo loginctl terminate-user zhangsan该用户可能还被某些服务的配置文件引用比如 Nginx 的运行用户、Samba 共享用户、数据库远程用户等。删除前需要评估这个用户是否被服务配置引用是否有计划任务需要清除是否加入了 sudo 组或特殊组家目录里是否有重要数据如果是删除一个“组”命令则是groupdel例如sudo groupdel devteam删除组前同样要确认该组是否是某个用户的主组以及是否有文件以该组为属组。4. 用户密码管理passwd 与 chage4.1 passwd 基础用法passwd是管理用户密码的核心命令。修改当前登录用户的密码passwd需要先输入当前密码再输入两次新密码。使用 root 或 sudo 修改其他用户密码sudo passwd zhangsan此时不需要知道旧密码直接设置新密码即可。有些系统出于安全策略要求密码符合复杂度例如至少 8 位、包含大小写、数字和特殊字符。如果设置的密码太简单可能会收到类似提示BAD PASSWORD: The password fails the dictionary check - it is based on a dictionary word在生产环境中不要因为提示麻烦就使用过于弱的密码。密码策略可以在/etc/pam.d/和/etc/security/pwquality.conf中调整。4.2 passwd 的实用参数passwd除了修改密码还可以用来锁定和解锁用户。锁定用户禁止其登录sudo passwd -l zhangsan查看用户密码状态sudo passwd -S zhangsan输出示例zhangsan L 2024-01-15 0 99999 7 -1 (Password locked.)其中L表示锁定LockedP表示可用密码Password setNP表示无密码。解锁用户sudo passwd -u zhangsan锁定操作的本质是在/etc/shadow密码字段前追加一个!前缀让系统无法正常校验密码从而实现禁止登录的效果。需要注意的是passwd -l禁止的是密码登录方式如果用户配置了 SSH 公钥登录仍然可能通过密钥登录系统。因此要彻底封禁一个用户还需要综合考虑 SSH 配置、账号状态、登录 Shell 等多个层面。4.3 /etc/shadow 密码字段详解查看 shadow 文件中的一行zhangsan:$6$4kG...:18963:0:99999:7:::字段含义分别是字段含义用户名用户名密码加密后的密码哈希最近修改时间距 1970-01-01 的天数密码最小使用天数0 表示可随时修改密码最大使用天数99999 表示长期有效过期前警告天数7 表示提前一周警告宽限天数密码过期后还能登录的天数失效日期账号失效日期空表示不失效手动编辑/etc/shadow是危险操作正常情况不推荐。需要调整密码有效期时应使用chage命令。4.4 chage 设置密码过期策略chage用于管理密码有效期。查看某个用户的密码过期信息sudo chage -l zhangsan设置密码 90 天后过期sudo chage -M 90 zhangsan设置密码最小使用天数为 7 天sudo chage -m 7 zhangsan设置密码过期前 14 天开始提醒sudo chage -W 14 zhangsan设置账号在 2025-12-31 失效sudo chage -E 2025-12-31 zhangsan强制用户在下次登录时修改密码sudo chage -d 0 zhangsan这种操作在批量创建临时账号时非常有用。如果这批账号仅用于项目周期内可以设置最大有效期和失效日期到期后账号自动不可用减少了人工清理成本。4.5 批量修改密码的注意事项在自动化脚本中可以使用chpasswd批量修改密码echo zhangsan:NewPass123 | sudo chpasswd也可以从文件读取多行用户密码sudo chpasswd users.txtusers.txt的格式为每行 “用户名:密码”。这种在脚本中明文携带密码的方式只适合内网测试环境生产环境应优先使用 Puppet、Ansible 等配置管理工具或通过安全的 CMDB 系统下发避免密码泄露到命令行历史中。5. su 切换用户的使用与原理5.1 su 与 su - 的区别su命令用于切换用户身份。从普通用户切换到 rootsu或指定用户名su root切换到指定普通用户su zhangsan很多新手会遇到困惑su和su -有什么区别su zhangsan切换用户身份但不加载目标用户的登录环境变量当前目录、PATH 等仍然沿用原用户。su - zhangsan模拟一次完整登录加载目标用户的登录 Shell、环境变量并切换到该用户的家目录。举个例子。root 用户执行su zhangsan echo $HOME输出可能是/root这往往和预期不符。而执行su - zhangsan echo $HOME输出会是/home/zhangsan。因此在需要完整切换用户环境时推荐使用su - 用户名而不是su 用户名。5.2 从 root 切换到普通用户root 切换到普通用户非常方便不需要输入普通用户的密码su - zhangsan切换后当前 Shell 的提示符会从#变为$表示已经是普通用户身份。使用exit或logout可以返回原来的用户exit5.3 从普通用户切换到 root普通用户切换到 root 时系统会要求输入 root 的密码su -如果输入正确的 root 密码则切换成功如果忘记 root 密码则无法通过su提升权限。这也是为什么生产环境更推荐使用sudo授权而不是随时提供 root 密码的原因。5.4 su: inaccessible or not found 报错分析热词中出现了一个常见报错su: inaccessible or not found。这个报错在 CentOS、Ubuntu 上都有可能出现尤其是在容器环境、精简安装系统或模拟器中。出现这个报错的原因通常有su命令本身不存在。当前用户没有配置正确的 Shell。环境变量 PATH 中没有包含/bin、/usr/bin等目录。/etc/passwd中用户对应的 Shell 路径错误。目标用户的登录 Shell 未被安装例如/bin/bash不存在。排查思路如下首先确认当前 Shell 是否正常echo $SHELL which bash如果which bash没有任何输出说明 bash 未安装或 PATH 异常。可以检查/etc/passwd中对应用户的 Shell 字段grep zhangsan /etc/passwd如果终端显示/bin/bash但系统实际没有/bin/bash文件就需要用包管理器安装或修改 Shell 字段。在 Ubuntu/Debian 系统中安装 bashsudo apt update sudo apt install bash -y在 CentOS/RHEL 系统中sudo yum install bash -y如果是容器环境就需要根据基础镜像的包管理器来安装。有时候问题不是 bash 缺失而是/etc/passwd中该用户的 Shell 被写成了不存在的路径此时可以使用支持工具修复登录 Shellsudo usermod -s /bin/bash zhangsan如果连su本身都无法使用可以直接使用绝对路径/bin/su - root对于某些模拟器环境报错可能是/bin/su与/usr/bin/su的 PATH 问题使用绝对路径可以绕过 PATH 造成的困扰。5.5 su 与 sudo 的选型建议su和sudo都可以提升权限但使用场景不同。对比项susudo使用方式切换到目标用户身份以指定用户身份执行单条命令密码要求需要目标用户密码需要当前用户自己的密码日志记录默认不记录每条命令会记录到安全日志权限控制切换后拥有目标用户全部权限可以通过 sudoers 精细控制生产环境推荐度较低更高sudo的核心优势在于最小权限。运维人员不需要知道 root 密码只需要在/etc/sudoers中被授权。例如允许 zhangsan 执行所有命令sudo useradd -m lisi而不需要切换到 rootsu - useradd -m lisi显然sudo更安全也更容易审计。在日常工作中如果只是需要临时执行某条管理命令优先使用sudo而不是su切换到 root。6. 综合实战从创建到删除用户的完整流程6.1 创建测试用户并设置密码在一个干净的测试环境中创建用户 testusersudo useradd -m -s /bin/bash testuser这条命令的含义是创建用户 testuser自动创建家目录/home/testuser指定登录 Shell 为/bin/bash。设置密码sudo passwd testuser输入两次一致且符合复杂度要求的密码。验证用户信息id testuser输出示例uid1001(testuser) gid1001(testuser) groups1001(testuser)6.2 查看用户相关文件查看 passwd 和 shadow 记录grep testuser /etc/passwd grep testuser /etc/shadow sudo chage -l testuser确认家目录已经生成ls -ld /home/testuser6.3 切换到该用户测试登录环境使用su -切换su - testuser输入 testuser 的密码切换后查看家目录pwd whoami输出应为/home/testuser和testuser。退出该用户exit6.4 删除用户并验证如果想保留家目录执行sudo userdel testuser如果想连家目录一起删除执行sudo userdel -r testuser验证用户是否已经删除id testuser如果输出no such user说明用户删除成功。确认家目录是否存在ls -ld /home/testuser6.5 处理已登录用户被占用的场景创建一个测试用户后先切到该用户su - testuser然后开另一个终端尝试直接删除sudo userdel -r testuser大概率会看到报错userdel: user testuser is currently used by process 20231正确处理流程# 查看该用户进程 ps -u testuser # 结束该用户进程 sudo pkill -u testuser # 终止登录会话 sudo loginctl terminate-user testuser # 删除用户和家目录 sudo userdel -r testuser如果 process 依然存在则需要检查是否有子进程由 init/systemd 托管必要时可以使用ps -ef | grep testuser确认。在生产环境中遇到“用户已登录”时不要直接kill -9可以通知用户保存数据后退出如果无法联系用户再评估强制清理的风险。7. 常见问题与排查思路问题现象常见原因解决思路userdel: user testuser is currently used by process用户还有进程在运行或处于登录状态使用ps -u、pgrep -u查看进程pkill结束后再删除su: user testuser does not exist目标用户已被删除或用户名输入错误使用id testuser检查用户是否存在su: inaccessible or not found登录 Shell 缺失、PATH 问题或 passwd 中 Shell 路径错误which bash检查usermod -s /bin/bash testuser修复使用绝对路径/bin/su - rootsu: Authentication failure密码错误或账号锁定确认密码是否输入正确使用sudo passwd -S 用户名查看状态passwd: Authentication token manipulation errorpasswd 文件被锁定或权限异常检查/etc/passwd、/etc/shadow是否可写重新执行sudo passwd 用户名userdel: cannot remove entry from /etc/passwd密码文件被其他进程锁定或权限不足确保以 root 或 sudo 执行检查文件锁是否被占用删除用户后仍然可以根据密码登录用户 uid/gid 被新的同名用户复用或 SSH 密钥未清理清理 SSH 授权密钥删除原用户在/etc/sudoers.d、cron 等配置残留userdel -r删除家目录但文件仍存在该用户在其他路径拥有文件使用find / -uid 原UID查找并处理7.1 忘记 root 密码怎么办如果忘记了 root 密码常规排查步骤如下如果有其他 sudo 用户可以通过sudo passwd root重置 root 密码。如果没有其他 sudo 用户则需要进入单用户模式或使用 live 系统进行修复。这一过程对服务器操作比较危险建议在测试环境中练习生产环境建议联系拥有控制台权限的管理员按规范操作。重置密码后应立即修改相关应用配置中引用的旧密码并检查/var/log/secure或/var/log/auth.log是否有异常登录记录。各发行版进入单用户模式的方法略有差异这里不展开细节以免误导。7.2 判断用户是否被锁定使用sudo passwd -S testuser如果显示Llocked就说明已被锁定。使用passwd -u解锁。在 shadow 文件中被锁定的密码字段通常以!开头。因此也可以执行sudo grep testuser /etc/shadow但要注意即使 shadow 中没有!如果/etc/shadow文件权限异常也会影响用户登录。8. 最佳实践与工程建议8.1 删除用户前的自查清单无论是清理离职人员账号、测试账号还是临时账号删除前建议确认以下几点该用户是否还有计划任务crontab -l -u 用户名。该用户是否被 Nginx、MySQL、Redis、Samba、FTP 等服务引用。该用户是否加入了sudo组或有专用 sudoers 配置。家目录和其他目录下是否有需要归档的文件。该用户是否还有其他 SSH 公钥授权。该用户是否正在登录状态。可以把这些操作整理成一个脚本但生产环境中更推荐人工确认关键项目后再执行。8.2 尽量使用 sudo而不是直接登录 root日常管理服务器时建议通过普通用户加 sudo 来执行管理命令而不是直接使用 root 登录。这样做的优势是操作有日志可查。不需要在多个环境中共享 root 密码。可以通过 sudoers 限制不同用户能执行的命令范围。降低误操作导致的系统级风险。sudoers 配置示例在/etc/sudoers.d下创建文件sudo visudo -f /etc/sudoers.d/devopsdevops ALL(ALL) NOPASSWD: /usr/bin/systemctl restart nginx这段配置的含义是允许 devops 用户不用输入密码即可执行systemctl restart nginx命令但不能执行其他管理命令。8.3 用户密码策略与账号生命周期对于长期服务器建议通过 PAM 模块配置整体密码策略例如设置最小密码长度、密码复杂度、失败锁定次数等。对于临时项目账号可以使用chage设置有效期避免账号长期失效无人处理。创建临时账号时的推荐命令sudo useradd -m -s /bin/bash tempuser echo Tempuser2025 | sudo chpasswd sudo chage -d 0 tempuser sudo chage -M 90 tempuser sudo chage -W 14 tempuser这段命令的含义是创建用户设置初始密码强制首次登录修改密码密码 90 天后过期提前 14 天提醒。8.4 关注国产 Linux 系统的差异随着国产 Linux 系统在政务、金融、教育等领域的使用增加现在很多运维工作会接触到 openEuler、统信 UOS、麒麟等系统。这些系统大多基于 Linux 内核基本命令是一致的但在用户初始 UID 范围、默认 Shell、软件包管理器、PAM 配置路径上可能有所不同。例如Ubuntu/Debian 使用apt。CentOS/RHEL/Rocky 使用yum或dnf。openEuler 使用dnf。统信 UOS 桌面版使用apt服务器版可能使用yum。当你在不同的发行版上执行用户管理命令时如果某个选项不可用优先检查系统版本和手册man userdel man passwd man chageLinux 用户管理这条线虽然看起来简单但真正做到安全、规范、可审计需要掌握的不只是命令本身还包括账号生命周期、权限控制、日志审计和服务依赖分析。本文只覆盖了删除用户、密码管理和 su 切换中最核心的常用内容实际生产环境中还可能涉及 LDAP、SSO、PAM、sudo 策略联动等更复杂的场景后面可以继续深入学习。如果你在 Linux 用户管理过程中遇到过其他奇怪的报错也欢迎在评论区一起讨论。
返回列表