Linux服务器登录密码忘了,最直接有效的解决方案是通过单用户模式或救援模式重置root密码,整个过程通常只需重启服务器并执行几条命令即可完成。
服务器重启后进不了系统?先别急着重装
很多站长和运维朋友都遇到过这种尴尬:手上一台Linux服务器,密码忘了,试了几次被锁在外面,瞬间后背发凉,尤其是linux服务器忘记密码这种事,往往发生在业务高峰期或者交接不当的时候,但其实这事远没有想象中那么可怕,只要你能接触到服务器的物理控制台或者有云服务商的后台权限,重置密码就是一个标准操作流程。
下面我会把几种主流场景下的重置方法捋一遍,你按自己的系统版本和服务器类型对号入座就行。
单用户模式重置root密码:最常用的野路子
单用户模式是Linux系统自带的一个维护模式,以root权限运行且不加载大部分服务,利用这个模式,我们可以直接改密码而不需要验证原来的密码。
CentOS 6及以下版本的操作流程
- 重启服务器,在GRUB引导界面出现时,快速按任意键进入菜单
- 使用键盘上下键选中内核行,按字母e进入编辑模式
- 找到以
kernel开头的行,在行尾追加一个空格和数字1(或者写single) - 按b键或Ctrl+X启动,系统就会以单用户模式进入
进入之后你会直接得到一个root shell(一个以root身份运行的命令行界面),此时运行passwd root,连续输入两次新密码,然后执行reboot重启,密码就生效了。
CentOS 7/8和RHEL 7+的Reset方法
这里有个区别:新版系统用init=/bin/bash替代了旧的single参数,而且还要处理SELinux的干扰,具体步骤如下:
- 在GRUB界面选中内核行,按e进入编辑
- 找到
linux16或linux开头的那一行,把ro改成rw,然后在行尾加上rd.break - 按Ctrl+X启动,系统会进入
switch_root环境(一个临时根文件系统的命令行界面) - 输入
chroot /sysroot切换到真实根目录 - 这时输入
passwd root设置新密码 - 如果系统开启了SELinux,执行
touch /.autorelabel,让系统下次启动时自动修正文件的安全上下文 - 按
exit退出chroot,再按exit或输入reboot重启
需要留意一点:如果你用的是云服务器,可能得先在云控制台里开启VNC控制台(即远程图形化操作界面),或者通过服务商提供的重置linux root密码入口来操作,因为很多云服务器默认不允许你随意重启,而且操作GRUB需要能看到引导画面。
Ubuntu/Debian系的重置密码路线
Ubuntu系的系统在引导方式上跟CentOS有些差异,但思路大同小异。
Ubuntu 16.04及更早版本的步骤
在GRUB菜单里选中高级选项(Advanced options),选择recovery mode(恢复模式),然后在弹出的菜单里选root – Drop to root shell prompt,此时你就进入root shell了,直接passwd改密码就行。
Ubuntu 18.04及之后版本的操作
新版Ubuntu对单用户模式做了调整,改用systemd的机制:
- 重启进入GRUB界面,按e编辑该内核条目
- 找到
linux开头的那行,将ro quiet splash替换为rw init=/bin/bash - 按Ctrl+X启动,得到root shell后执行
passwd设置新密码 - 如果系统启用了SELinux(Ubuntu默认没开,但如果你手动装过,就要执行
touch /.autorelabel) reboot重启
这套流程对ubuntu重置系统管理员密码的需求同样适用,甚至包括上机豆服务器这类带控制台的Linux VPS,只要有VNC或KVM(一种远程键盘显示鼠标切换设备),操作路径是一样的。
忘记密码时还能用哪几种救援通道
在某些场景下,单用户模式可能走不通,比如GRUB设置了密码保护,或者磁盘LVM(逻辑卷管理器)加密了,又或者是云服务器不允许直接进入引导菜单,这时候就得换思路。
用云服务商的救援模式功能
几乎所有主流云厂商都提供救援模式或者叫做管理终端的功能,以简米云、酷番云、华为云等厂商的Linux服务器为例,你可以在控制台关机,然后挂载救援镜像,服务器会从一个独立的救援系统启动,此时把原来的系统盘挂载上去,然后chroot进去修改密码。
具体操作路径大致是:
- 进入云控制台,找到目标实例
- 关机后在实例详情里选择“救援模式”或“重置密码”
- 如果走救援模式,连接后把数据盘(就是原来的系统盘)挂载到/mnt
- 执行
chroot /mnt,然后passwd root - 退出并卸载磁盘,重启服务器
行业共识认为,云服务器用户优先看控制台有没有“重置密码”按钮,这是最省事的方式,不用碰命令行,没有这个按钮的话再用救援模式,绝大多数情况下能兜底。
使用Live CD或ventions启动盘
这个是针对物理机,或者你自己有独立服务器托管在机房的情况,用另一台电脑下载一个CentOS或Ubuntu的Live镜像(光盘启动盘),刻录成U盘,插入服务器的USB接口,从U盘启动系统,然后把硬盘上的根分区挂载到某个目录下,再用chroot改密码,具体命令跟上面的救援模式差不多。
这个方法的物理门槛高一些,操作时一定要确认服务器支持U盘启动,而且得能进入BIOS设置启动顺序,如果服务器托管在机房,通常得联系机房人员协助插拔U盘。
死磕这几个参数就能救回来
很多人对linux怎么进入单用户模式这个问题一直搞不清楚,其实就是因为各系统的入口不完全一样,下面这张表汇总了常见系统的参数差异,方便你对照:
| 系统版本 | 编辑目标行 | 追加参数 | 备注 |
|---|---|---|---|
| CentOS 6 | kernel行 | 1 或 single |
修改后按b启动 |
| CentOS 7/8 | linux16/linux行 | rd.break |
需将ro改为rw |
| Ubuntu 16.04 | 高级选项recovery mode | 菜单选择 | 进入root shell |
| Ubuntu 18.04+ | linux行 | rw init=/bin/bash |
修改后Ctrl+X |
| Debian 10+ | linux行 | single |
需把ro改为rw |
在操作时还有几个容易踩的坑值得提一下:
- 改了GRUB参数启动后,系统提示认证失败,往往是因为忘了把
ro改成rw,导致根文件系统是只读状态,你写的密码没保存进去 - 如果系统盘使用了LVM,不用太担心,只要不自己删逻辑卷,启动流程会自动找到卷组
- 修改完密码一定要记得重启验证一次,别直接在手工改过的状态下继续跑业务
重置完密码后该补上的作业
密码找回来了只是第一步,后续的安全工作如果不做,这事儿还会再发生。
一种做法是把密码换成SSH密钥认证(一公一私的加密配对认证方式),密钥文件放本地,服务器端只保留公钥,这样就算密码被暴力破解也没用,另一种做法是设置定期轮换密码的机制,比如三个月改一次,避免密码长期不变被撞库。
同时建议检查一下有没有其他账号存在弱密码,特别是那些有sudo权限(可执行超级管理员操作的授权)的普通用户,据调查显示,相当一部分服务器被入侵,都不是root密码泄露,而是先从某个普通用户的口令被猜中,再通过提权拿到管理员权限的。
如果你是在linux服务器租用商家那边买了服务器,最好把服务商提供的控制台登录账号和密码单独存档,方便遇到问题时走救援通道,手边备一份常见命令速查表,比如passwd、chroot、mount这几个高频命令的参数,关键时刻能省不少事。
密码重置过程中常见问题解答
Q:为什么我在单用户模式下改了密码,重启后还是进不去?
通常是因为你没有把根分区挂载为可写状态,检查一下引导参数里是否把ro改成了rw,如果是用rd.break方式,还要确认执行了chroot /sysroot之后再执行passwd。
Q:云服务器没有显示GRUB引导界面,怎么进单用户模式?
不是所有云环境都允许你直接看到GRUB菜单,此时改用云控制台提供的“重置密码”或“救援模式”功能即可,如果两者都没有,就得提工单联系服务商协助处理,这通常属于平台支持的范畴。
Q:单用户模式和救援模式哪个更推荐?
如果服务器在你手里且能看到引导界面,优先用单用户模式,速度最快,如果是云服务器且物理控制台不可用,优先用救援模式,两者修改密码的效果一致,最后都能达到重置root密码的目的。
上述所有方法,核心就是利用系统启动过程中的权限真空期,用root权限重置密码,只要你有物理或虚拟控制台的访问权限,linux服务器修改登录密码忘了就不是绝境,一步步操作下来,系统很快就能重新掌控在自己手里。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/linux%e6%94%b9%e7%99%bb%e5%bd%95%e5%af%86%e7%a0%81%e5%bf%98%e4%ba%86%e5%92%8b%e5%8a%9e%ef%bc%9f%ef%bc%8croot%e5%af%86%e7%a0%81%e6%80%8e%e4%b9%88%e9%87%8d%e7%bd%ae%ef%bc%9f/


