首页 / 资讯中心 / 文章详情

Linux修改root密码与普通密码:从命令到应急恢复全指南

Linux修改root密码与普通密码:从命令到应急恢复全指南 ★ FEATURED ARTICLE
修改root密码和普通密码一次搞定系统身份管理的所有姿势做运维这些年遇到最多的“紧急求助”不是服务器宕机也不是磁盘写满而是“我忘了密码”。root密码忘了、普通用户密码过期、新买的云主机密码太复杂不想用……凡是跟密码相关的说穿了都绕不开Linux系统里最基础也最关键的两个东西root账户和普通账户的身份管理。这篇文章就把修改root密码和普通密码这件事彻底讲透覆盖常用命令、交互细节、批量场景、忘记密码后的应急恢复以及那些文档里不会写但实操中非常要命的坑。我尽量不绕弯子直接上干货。如果你是刚接触Linux的小白可以按顺序读如果你已经是熟练工可以直接跳到后面安全加固和问题排查的部分那里有大多数教材压根不讲的经验。1. 密码到底存在哪先搞明白Linux的认证体系很多人以为改密码就是敲一条passwd命令这么简单但真正遇到问题的时候——比如root密码忘了、普通用户sudo提权卡住、密码明明输对了却登录不上——你会发现不理解底层机制排查起来就是在黑夜里摸电线杆。1.1 root账号与普通账号的权限边界Linux系统里root是唯一的超级管理员账号UID为0。它拥有对文件系统、进程、用户管理、网络配置等一切资源的绝对控制权。普通账号UID从1000开始不同发行版略有差异只能操作自己权限范围内的内容。这两类账号的密码管理有一个核心区别修改自己的密码不需要任何特殊权限但修改别人的密码包括修改root密码必须要有root权限。这是系统的安全边界设计——否则任何用户都能把别人的密码改掉系统就彻底乱了。所以当你需要修改root密码的时候实际上你是站在root权限的视角来操作而当你修改普通密码时要么是用户本人登录后自助修改要么是管理员用root身份强制重置。1.2 /etc/shadow文件密码真正的家经常有人问/etc/passwd文件里不是也有密码字段吗为什么要单独提/etc/shadow早期Unix系统确实把密码哈希放在/etc/passwd里但该文件对所有人可读于是密码哈希暴露给任何能登录系统的用户暴力破解风险极大。现代Linux系统把密码哈希挪到了/etc/shadow这个文件默认只有root和shadow组可读而且每行还包含了密码策略相关的元数据。/etc/shadow每一行的格式大致是username:密码哈希:最近修改时间:最短修改间隔:最长有效期:失效前警告:宽限期:失效日期:保留字段我给你拆解一下密码哈希字段如果显示!或*表示该账户密码被锁定不能正常登录最近修改时间是从1970年1月1日算起的天数最短修改间隔是指两次修改密码之间必须等待的天数最长有效期则是强制要求多少天后必须换密码失效前警告是到期前提前几天提示用户宽限期是密码过期后还能登录的天数。了解这些字段对后面排查“密码明明改了却登录不了”“提示密码过期”这类问题非常有帮助。比如你设置了chage -M 9090天有效期到期后系统会要求用户强制修改密码这时候如果用户不知道新密码规则就会陷入“登录即改密码改完又提示不符合策略”的死循环。注意修改密码后不要手动编辑/etc/shadow除非你非常清楚哈希算法和字段含义。常规操作应该用passwd、chpasswd这类命令它们会自动处理哈希生成和字段更新。1.3 哈希算法与密码加密的演变早期的密码哈希用的是DES后来逐步演进到MD5用$1$标识、SHA-256$5$、SHA-512$6$现在很多新版系统默认使用yescrypt$y$或scrypt/argon2等更强的算法。为什么算法重要因为它直接影响暴力破解的难度。DES的哈希碰撞和运算速度在今天的硬件条件下早已不适合保存密码MD5也已被证明不适合存储口令。SHA-512至今在很多发行版仍是默认选项但更推荐使用yescrypt这样的内存困难型算法——这类算法不仅需要CPU计算还需要较大的内存占用大幅提升了暴力破解成本。如果你的系统里还能看到$1$开头的哈希值建议尽快安排把所有密码重置一遍让系统使用新的默认哈希算法。经验检查系统当前密码算法最简单的方式是查看/etc/login.defs里的ENCRYPT_METHOD配置项。Debian/Ubuntu系默认多为YESCRYPTCentOS/RHEL 8及以后多为SHA512但具体以版本为准。2. 修改普通用户密码最常用的几种姿势普通用户密码的修改是全系统最高频的操作之一。新员工入职、同事离职交接、临时开测试账号、周期安全合规要求换密码……很多场景都要用到。这里我把最常用的几种方法全部列出来并附上适用范围和注意事项。2.1 交互式修改最简单也最容易忽略细节普通用户修改自己的密码直接登录终端输入passwd系统会先提示输入当前密码验证身份然后要求输入两次新密码。注意在输入密码时终端不会显示任何字符这是正常现象不要以为是键盘坏了。我之前见过有人按了几十下然后跟我说系统“不响应”其实是输入正确后回车即可。root修改其他普通用户的密码同样是用passwd命令但直接指定用户名passwd username这种方式不需要知道该用户的当前密码root可以直接强制重置。系统会直接提示输入新密码两次不会要求你输入旧密码。这个交互逻辑非常合理——管理员重置密码本来就不应该依赖用户的旧密码。注意root在重置密码时系统会提示passwd: password updated successfully但这不代表用户下次登录一定顺利。如果账户本身被锁定或者密码策略有特殊限制仍可能出现问题。所以改完后建议立刻用su - username测试一下别等到用户反馈登录失败才发现问题。2.2 免交互批量修改密码自动化场景下比如批量创建测试用户、定期巡检重置密码再手工敲交互命令就太蠢了。这时候有两个常用选择选择一用chpasswd它支持从标准输入读取“用户名:密码”的格式echo username:NewPassword123 | chpasswd选择二用passwd配合--stdin参数CentOS/RHEL系支持echo NewPassword123 | passwd --stdin username注意--stdin在Debian/Ubuntu系默认并不支持所以跨平台脚本里我一般首选chpasswd。如果要批量修改多个用户while read user pass; do echo $user:$pass | chpasswd done users.txtusers.txt里每行格式就是用户名:新密码。这里有个非常关键的建议users.txt用完后要立刻删除或者用chmod 600限制权限不然密码文件外泄等同于账号裸奔。我见过有人把临时密码文件放在/tmp下忘删的那基本上就是把账号拱手送人。2.3 批量修改密码后的强制首次登录修改安全合规要求通常不允许管理员知道用户密码所以最佳实践是管理员生成一个随机初始密码然后强制用户在首次登录时自己修改。这个需求用一条命令搞定chage -d 0 username该命令把/etc/shadow里最近修改时间字段设为0系统会在用户下次登录时强制要求修改密码。这样即使管理员手里有初始密码但用户一旦改完管理员就无法再获知用户的新密码。除了chage -d 0以下两个命令也值得掌握chage -M 90 username # 设置密码最长有效期90天 chage -l username # 查看密码策略详情我还建议在创建新用户的自动化脚本里把这三行连起来useradd newuser echo newuser:Temp2025 | chpasswd chage -d 0 newuser这样一个临时密码、一次强制更改、一份审计记录就齐整了。实操心得别把初始密码设置得太复杂比如Kx9#mP2$vLq这种用户看得眼花缭乱不说抄写时很容易出错。建议用“大写字母小写字母数字可读符号”的8~12位组合比如Temp2025xz既满足基本策略要求又不会让用户想骂人。2.4 密码过期与锁定状态的处理有些用户会发现突然登录不了界面提示“password has expired”或者直接“account is locked”。这两种情况的处理方式完全不同。密码过期用passwd修改即可解决。但如果账户被锁定修改密码也无效。需要先解锁usermod -U username对应的锁定账户命令是usermod -L username锁定与过期的本质区别在于过期是“密码策略要求你必须换新密码”锁定是“无论密码对不对该账户暂时不能登录”。这是运维排查时必须能分辨的。另外还有一个隐蔽的场景账户尚未锁定但登录Shell被改成了/usr/sbin/nologin用户会看到“This account is currently not available”的提示。这跟密码无关是Shell配置问题。3. 修改root密码从登录态到忘记密码的全流程root密码的管理权重比普通用户高得多因为root本身就是权限的顶点。下面分两种情况讲一种是还能以root或有sudo权限的管理员账号登录系统另一种是root密码彻底忘了、系统进不去的情况。3.1 登录状态下直接修改root密码如果当前终端是root那么直接执行passwd因为root修改自己时不需要输入旧密码直接设置两次新密码即可。这里系统有安全提示如果新密码过短或过于简单passwd会给出警告并要求确认但最终仍会接受除非PAM策略强制拦截。所以即使你设了123456系统大概率也会通过——但这不意味着安全上没问题。如果当前登录的是有sudo权限的普通用户那就要用sudosudo passwd root这个命令会提示输入当前用户的密码sudo验证随后就能重置root密码。注意如果当前用户在/etc/sudoers里连passwd命令都没被允许执行那会直接报错此时只能通过其他途径恢复。一个跟直觉相反的点sudo passwd和sudo passwd root在多数情况下结果一样但如果你在/etc/sudoers里配置了某些安全策略作用范围也会有差异。尽可能明确指定用户名避免踩到命令权限管控的坑。3.2 忘记root密码的应急恢复单用户模式这是所有运维必备技能。所谓“忘记root密码”通常是指系统已经不能通过正常登录进入root而普通用户又没有sudo权限的绝望局面。这时候需要重启系统并进入单用户模式来重置密码。不同发行版和不同引导环境操作细节有差异但核心逻辑是一样的绕过正常认证流程以临时root身份直接重置密码。以主流systemd发行版RHEL/CentOS 7/Ubuntu 16等为例流程通常是重启系统在GRUB引导菜单出现时选中内核那一项按e进入编辑模式找到以linux或linux16开头的那一行在末尾追加rd.breakRHEL/CentOS系或先在行尾删掉splash quiet加上init/bin/bash部分Ubuntu系统完成编辑后按CtrlX或F10引导启动系统会进入紧急维护环境或直接获得root shell。不同发行版后续处理很不一样我分别举个例子CentOS/RHEL用rd.break时系统根目录会以只读方式挂在/sysroot而不是/需要先重新挂载再切根mount -o remount,rw /sysroot chroot /sysroot passwd root touch /.autorelabel exit rebootUbuntu/Debian系如果追加init/bin/bash通常会直接进入root shell且根分区是只读的需要先mount -o remount,rw / passwd root exec /sbin/init这里有两个极容易翻车的要点。第一touch /.autorelabel的作用是提醒SELinux在下次启动时重新标记文件上下文。如果跳过这步修改后的文件可能因为SELinux上下文错误导致系统起不来或者密码生效异常。CentOS等默认启用SELinux的系统务必执行。Ubuntu/Debian默认没有SELinux这步可省。第二很多人改完密码后直接reboot结果起不来或者登录卡住。原因多半是他们忘了改回GRUB里的参数或者没有正确处理根文件系统的只读状态和SELinux重标记。密码修改不是唯一关键步骤启动环境的恢复同样关键。重要提醒单用户模式不等于“无痕操作”。系统日志里很可能记录下启动过程中的异常如果服务器有严格的安全审计还是应该通过官方渠道重置密码。3.3 使用已有root权限通过救援模式重置密码如果你的服务器是云主机很多云厂商提供了救援模式或VNC控制台。这类方式本质上也是让你绕过正常登录进入系统相比物理机进入GRUB更安全可控。进入方式因厂商而异但进去后看到的操作界面基本一致——你会得到一个root shell此时执行mount -o remount,rw / passwd root如果系统根分区不在默认路径比如LVM或加密盘还需要先排查挂载情况。这类场景我建议的排查顺序是先看/etc/fstab了解分区布局再手动挂载到/mnt然后chroot /mnt后执行密码重置。别上来就passwd万一挂载错了你等于改了个空壳系统的密码。3.4 彻底忘了root且没有救援手段时的备选思路如果你连救援模式都进不去那问题就从“改密码”变成了“重新认证”。这种情况下运行中的系统能做的动作非常有限但有一个思路值得参考如果服务器上还有其他拥有sudo权限的普通用户直接切换过去再重置rootsudo -i passwd root如果普通用户的sudo权限也被没收了那就只能考虑重装系统或用引导介质修复这属于灾难恢复范畴这里不展开。强调一点越早发现自己无法进入系统越容易用简单手段解决拖得越久恢复成本越高。4. 修改密码背后的安全策略与常见问题实战密码无论怎么改都是在和“人”与“策略”打交道。很多时候用户改密码失败不是命令敲错了而是系统策略不让过。理解PAM和安全策略才能精准解决问题。4.1 PAM模块如何影响密码修改Linux的密码修改流程本质上由PAM控制。以常见的system-auth或common-password配置文件为例里面通常有几条关键规则pam_pwquality.so负责密码复杂度检查比如最小长度、至少包含几类字符、不能与用户名相同等pam_unix.so负责密码哈希、历史检查记住密码不能跟旧密码一样pam_faillock.so负责失败锁定策略。当你执行passwd时实际上是调用了PAM栈来完成身份验证和策略检查。所以如果你遇到“密码太简单”“不能与旧密码相同”“Try again later”这类报错方向不是怀疑命令问题而是检查PAM配置。比如设置最小密码长度在RHEL系可以通过/etc/security/pwquality.conf里的minlen项调节。在Debian/Ubuntu系对应逻辑在/etc/pam.d/common-password里的pam_pwquality那行配置。4.2 常见报错排查速查场景报错或现象常见原因处理方式修改密码时提示“password has expired”登录后强制要求改密码密码策略过期直接按提示设置新密码或管理员用chage调整策略提示“account is locked”或“locked”账户锁定usermod -L或多次失败锁定usermod -U解锁或等待锁定期结束密码修改成功但登录仍失败登录认证失败密码哈希不一致、SELinux上下文异常检查/etc/shadow对应行必要时重新passwd并处理SELinux批量重置后用户无法登录提示密码错误chpasswd读入格式错误确认文件格式和文件编码最好用printf而不是echo的某些转义场景root密码重置后重启无法登录死循环或卡在启动忽略了SELinux重标记或GRUB修改未恢复回看单用户模式流程中的touch /.autorelabel步骤vagrant等云镜像默认密码失效SSH连接被拒镜像出厂未设置密码或禁用root SSH用云控台VNC登录后重置4.3 密码策略收紧的实操建议日常服务器上我倾向于把密码策略设置成“不折腾但守底线”的状态。一个可落地的建议# 在RHEL系配置 vim /etc/security/pwquality.conf # minlen 12 # dcredit -1 # ucredit -1 # lcredit -1 # ocredit -1这样要求至少12位并且必须包含数字、大写、小写、特殊字符。对于普通用户来说这个强度完全够用。同时在/etc/login.defs里设置PASS_MAX_DAYS 90 PASS_MIN_DAYS 1 PASS_WARN_AGE 790天强制更换、最短1天防止用户一天内改回原密码、提前7天提醒。从经验来看密码策略不是越复杂越好。过长的强制周期和超复杂的字符要求会让用户把密码抄在便签上反而更容易泄密。我更推荐启用pam_pwhistory记住最近5次密码并且配合faillock做5次失败锁定这才是比较平衡的方案。建议不要在生成密码和策略时过度设计。真正的安全防线应该是多因子认证、SSH密钥管理、防火墙和审计而不是让用户记住二十位乱码。5. 几个少有人提但是很值钱的实操小细节接下来的内容偏“运维老兵经验”是许多教程不写、但你在真实环境里几乎一定会遇到的细节。每一条都是我亲测或帮人排障得来的教训。5.1 修改密码后立刻用新密码验证一次无论你改的是root还是普通用户密码只要环境允许立刻打开一个新会话验证。别相信passwd提示的“successfully updated”——那只是写入了哈希不代表认证链路完全通畅。我自己踩过最惨的一次跟SELinux有关单用户模式改了root密码当时登录能用重启后就起不来了正是因为少了重标记文件上下文这一步。从头到尾没有工具能提前提醒你只能靠验证和习惯。5.2 密码中的特殊字符与终端转义批量修改密码时如果密码包含$、!、\、反引号等必须考虑Shell转义问题。比如密码Pss$w0rd中的$会被Shell当作变量引用echo user:Pss$w0rd | chpasswd这里的$w0rd会被解析成变量w0rd通常为空结果密码被改成了Pss。这个问题非常隐蔽不仔细看根本发现不了。建议用单引号或转义来处理echo user:Pss$w0rd | chpasswd或者在脚本中写成chpasswd EOF user:Pss$w0rd EOF但heredoc里存在变量替换风险安全做法是配合set -f关闭通配符或者用加密方式管理初始密码文件。这类细节看似微小但生产环境账号一旦因此失联排查成本非常高。5.3 为什么修改的是密码却提示/etc/shadow无权限普通用户执行passwd修改自己的密码没问题但如果你用passwd username去改别人的密码会立刻遇到Permission denied。原因是密码写入需要root权限。这不是命令本身的问题是权限模型。同理chage、usermod大多数操作都需要root。有些用户会问为什么我修改自己的密码时系统能写/etc/shadow因为passwd命令本身带有SETUID位普通用户执行时以root身份运行了有限的功能只改自己的密码条目这是系统的精巧权限设计。5.4 修改SSH端口与密码保护很多人喜欢改SSH端口来规避扫描但这跟密码修改其实是两码事。改密码解决的是“认证凭据泄露”的问题改端口则是缩小攻击面。我建议两手抓对外只开放密钥认证内部跳板机再考虑密码登录。具体配置是/etc/ssh/sshd_config里的PasswordAuthentication no PubkeyAuthentication yes如果必须要密码登录风险就集中在密码强度上所以再强调一遍密码策略别形同虚设。6. 用一条命令组合出标准的密码管理流程最后把整套流程拧成一条命令串方便你在新服务器上线、新员工入职或定期巡检时直接套用。#!/bin/bash # 密码重置与策略设置组合脚本需root执行 USERNAME$1 if [ -z $USERNAME ]; then echo Usage: $0 username exit 1 fi # 生成一个满足基本策略的随机密码 NEWPASS$(date %s | sha256sum | base64 | head -c 12) # 设置密码并强制下次登录修改 echo $USERNAME:$NEWPASS | chpasswd chage -d 0 $USERNAME # 输出一次性密码 echo 用户 $USERNAME 的临时密码为$NEWPASS echo 系统已强制该用户在首次登录时修改此密码这段脚本的重点是chage -d 0它把“密码最近修改时间”清零使密码立即过期。安全性上临时密码只输出到终端不留文件降低泄露风险。如果你想留审计记录建议记录的是用户ID和操作时间而不是密码本身。经验补充随机密码生成时不要用openssl rand -base64的完整输出因为可能包含/、、等特殊字符传给chpasswd时要考虑转义问题。上面用sha256sum | base64 | head是比较土但稳的办法。如果你更追求密码强度可以用openssl rand -base64 12再过滤掉不适合的字符。写在最后的一点体会算一算这些年处理过的密码问题没有上百也有几十起了。最让我记忆深刻的不是技术多难而是很多事故本来完全可以避免比如密码存在明文文件里忘了删、策略过强导致用户把密码贴在显示器上、单用户模式改了密码却没做SELinux重标记导致重启失败。管理root密码和普通密码本质上是在跟“人”和“流程”打交道而非纯粹的技术指标。我个人的习惯是每个重要系统都建立密码变更台账每次修改后强制新会话验证一次批量操作前永远先在一个测试账户上跑通临时文件用完立刻销毁。这些笨功夫往往能在关键时刻救你一把。最后再分享一个小技巧定期用chage -l查看系统中所有账户的密码状态重点关注那些长期未登录、密码永不过期的账户这类账户往往是被忽略的隐患。安全不是一次密码修改就万事大吉的而是一套持续的习惯。
阅读完成 · 觉得有帮助?
咨询建站