Linux服务器密码过期进不去,最快的解法是换一条登录通道:有云控制台VNC就走VNC,物理机就进GRUB单用户模式,进去后用 chage 或 passwd 把过期状态清掉,全程不需要重装系统或恢复数据。至于为什么普通用户还能登、root却直接报错,下面按实际遇到的场景拆开说。
先别急着重装:搞清楚是密码过期还是账号被锁
SSH连上去,看到 Your password has expired. You must change your password now 或者 WARNING: Your password has expired,这就是密码过期,如果看到的是 Your account has expired; please contact your system administrator,那问题不在密码,而在账号本身被设了失效日期,两句话长得像,处理方式完全不同。
用chage一眼看穿真实状态
能登上服务器(哪怕是普通账号)时,先跑这条命令:
chage -l root:看root账号的密码有效期、账号失效时间chage -l 你的用户名:看当前账号sudo grep root /etc/shadow:直接读shadow文件第3和第8字段
输出里几个关键字段要会看:
- Password expires:
never表示永不过期,有具体日期说明到期了 - Account expires:这个才是账号失效时间,和密码过期是两码事
- Maximum number of days between password change:密码最大有效天数,很多云厂商镜像和等保合规要求会设成90天或180天
/etc/shadow 文件里,冒号分隔的字段中,第3字段是最后一次改密日期,第5字段是密码最大有效天数,第8字段是账号失效日期,第5字段决定密码会不会过期,第8字段决定账号会不会被禁用。
Linux密码过期和账号锁定有什么区别
这是两个经常被混为一谈的概念,处理路径差得远:
| 状态 | 触发原因 | SSH表现 | 能否远程自救 |
|---|---|---|---|
| 密码过期 | 超过最大有效天数 | 提示改密,普通用户可登录后修改 | 普通用户能,root一般不能 |
| 账号过期 | 设置了失效日期 | 直接拒绝,提示account expired | 不能 |
| 账号被锁 | 多次输错密码、fail2ban封禁 | 拒绝连接或超时 | 不能 |
| 密钥权限错误 | authorized_keys或目录权限不对 | 提示Permission denied | 视情况 |
业内专家指出,生产环境中相当一部分”密码过期进不去”的报障,实际是账号被安全策略设了失效日期,或者fail2ban把来源IP封了,所以第一步永远是确认报错原文,别凭感觉操作。
SSH登录提示password expired时,远程还能做哪些事
这个报错并不总是死路一条,取决于你用的是哪个账号。
普通账号:跟着提示走三步
普通用户密码过期后,SSH通常会强制你改密,流程是:
- 正常输入旧密码
- 系统提示
Changing password for user xxx,连续输入两次新密码 - 改完自动断开,重新用新密码登录
新密码要过PAM的复杂度校验,太简单会报 BAD PASSWORD,如果连续输错导致账号被锁,就得等锁定时间过去或者从特权账号解锁。
root和关键服务账号:远程通道基本关闭
root账号密码过期后,SSH往往直接拒绝,因为系统不允许root在非交互场景下强制改密,这时候远程SSH这条路就断了,必须换入口,行业共识认为,root账号应该长期保持密钥登录、禁用密码登录,密码过期只作用于应急路径,这样既满足合规要求,又不至于把自己锁在门外。
Linux root密码过期怎么修改:三条进入路径的实际操作
这是整件事的核心,三条路各有适用场景,按省事程度排。
云厂商VNC控制台,最省事
简米云、酷番云、华为云的控制台都提供VNC或Web Terminal远程连接,走的是虚拟化层,不依赖SSH服务,操作路径基本一致:
- 登录云控制台,找到目标实例
- 点”远程连接”,选择VNC方式
- 输入用户名和密码,密码过期时会直接提示改密
- 改完退出,回SSH验证
VNC方式不经过sshd,PAM的强制改密逻辑在控制台登录里通常只做提示不做阻断,所以能顺利进去,这条路不用重启业务、不用停机,是云服务器的首选。
GRUB单用户模式,物理机和可重启实例适用
进不去控制台或者没有VNC,就重启进单用户,CentOS、Rocky、AlmaLinux这一系:
- 重启,在GRUB菜单按
e进入编辑 - 找到以
linux或linux16开头的那行,在末尾加rd.break Ctrl+X启动,进入紧急shell- 依次执行:
mount -o remount,rw /sysrootchroot /sysrootpasswd roottouch /.autorelabel(SELinux开启时必须,否则改完登不进)exit两次,或reboot -f
Ubuntu、Debian这一系略有不同:
- GRUB菜单按
e - 找到
linux那行,把ro改成rw,在末尾加init=/bin/bash Ctrl+X启动- 执行
passwd root,如果提示文件系统只读,先mount -o remount,rw / exec /sbin/init或直接断电重启
要注意的是,SELinux开启的机器改完密码不执行autorelabel,登录会一直报Permission denied,这是单用户模式最常见的坑。
救援模式挂载系统盘,最兜底
云厂商一般都有”救援模式”或”进入救援系统”功能,本质是把系统盘挂到另一台临时实例上,适合单用户模式也进不去、或者GRUB被改坏的情况,挂载后编辑 /etc/shadow,把root那一行的第5字段改成 99999,第8字段改成空,或者直接清空第2字段密码位再用passwd重设。
需要提醒的是,直接改shadow文件容易手抖出错,改之前先 cp /etc/shadow /etc/shadow.bak,如果自己没把握,市面上第三方远程处理服务一般按次收费,价格取决于响应速度和是否需要数据侧处理,云厂商自身的基础工单支持多数情况下不额外收费。
云服务器密码过期远程登录失败,进去之后先做这三件事
好不容易登进去,别急着收工,下面几件事决定你明天会不会再被锁一次。
把过期策略调整到合规又合理的区间
chage -M 90 -W 7 root:最大有效期90天,提前7天告警chage -m 1 root:两次改密最小间隔1天,防止频繁改密绕过历史密码检查chage -I 7 root:密码过期后给7天宽限期,宽限期内还能登录改密chage -E -1 root:取消账号失效日期,避免account expired
不要图省事设成99999天,等保2.0和多数行业规范对密码周期有明确要求,设成永不过期在合规检查里是扣分项,合理区间是90到180天,配合密钥登录使用。
密钥登录做兜底通道
密码策略管得越严,越需要一条不受密码过期影响的通道:
ssh-keygen -t ed25519生成密钥对ssh-copy-id user@server或手动把公钥追加到~/.ssh/authorized_keys- 确认
chmod 700 ~/.ssh、chmod 600 ~/.ssh/authorized_keys - 在
/etc/ssh/sshd_config里设PasswordAuthentication no,只留密钥
过来人的经验是,至少保留一个密钥登录的特权账号,密码过期再怎么折腾都有一条路能进。
把改密流程写进运维文档
密码过期不是故障,是策略生效,真正的问题是没人提前知道它什么时候到期,在监控里加一条chage到期提醒,或者在堡垒机、配置管理工具里统一轮换,比事后进单用户模式省事得多。
Linux服务器密码过期进不去怎么办:三个高频疑问
问:SSH提示密码过期,我输对了旧密码为什么还是进不去?
答:分两种情况,普通用户输对旧密码后会进入强制改密流程,输错新密码或新密码不合规会被踢出;root账号和设置了账号失效日期的账号,sshd会直接拒绝会话,根本没有改密机会,看报错是password expired还是account expired就能区分。
问:单用户模式改完root密码,重启后还是登不进去?
答:最常见的原因是SELinux没有重新打标签,改完密码必须执行 touch /.autorelabel 再重启,其次是改错了文件系统,单用户模式下根分区可能还是只读,passwd 命令表面上成功,实际没写进 /etc/shadow,第三种情况是账号本身设了失效日期,改密码不解决 chage -E 的问题。
问:云服务器不想重启,能不能不通过控制台改密码?
答:如果还有任意一个能SSH登录的sudo账号,直接用 sudo passwd root 或 sudo chage -M 180 root 就能处理,不需要重启,一旦所有入口都被密码过期挡住,云服务器的VNC控制台就是唯一不重启的通道;VNC也进不去,才需要走单用户模式或救援模式。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/788664.html


