生产环境救急指南:Linux服务器忘记密码的N种解法,覆盖主流系统和云厂商

说实话,做运维这么多年,密码忘记这事儿我自己都干过好几次,更别提帮别人处理的次数了,有时候是接手别人的机器没交接清楚,有时候是自己太久没登录给忘了,还有的时候是同事离职了账号没留......反正各种奇葩情况都遇到过。

今天就把这些年的经验整理一下,把主流Linux发行版和云厂商的密码重置方法都捋一遍,希望能帮到有需要的朋友。

为啥密码会忘?

先聊聊原因吧,这个其实挺重要的,知道原因才能避免下次再犯。

我见过最多的几种情况:一是服务器太多,密码策略又要求定期更换,换着换着就乱了;二是接手别人的机器,文档没留或者留错了;三是测试环境随手设了个简单密码,结果上线后找不到记录;还有一种就是纯碎自己脑子短路,设了个自认为能记住的密码,过两天就忘得一干二净。

不管啥原因吧,反正密码忘了就是忘了,得想办法解决。

传统物理服务器/虚拟机的密码重置

2.1 Ubuntu/Debian 系列的单用户模式

这个方法算是比较经典的了,适用于你能接触到服务器控制台的情况,不管是物理机的显示器键盘,还是虚拟机的VNC控制台。

操作步骤其实不难,但不同版本有点小区别。

Ubuntu 20.04/22.04/24.04 的操作:

重启机器,在GRUB启动界面出现的时候,赶紧按住Shift键(有些机器是ESC),让GRUB菜单显示出来。选中第一项,也就是默认的启动项,按键盘上的e键进入编辑模式。

在编辑界面里往下找,找到以linux开头的那一行,挺长的,一般在中间位置。找到ro quiet splash这部分,把ro改成rw,然后在后面加上init=/bin/bash

改完之后按Ctrl + X或者F10启动,这时候系统会进入一个简单的shell环境,不需要密码。

然后就是重置密码了:

bash 复制代码
passwd root
# 输入新密码两次

如果系统提示Authentication token manipulation error,可能是文件系统只读挂载了,先执行:

bash 复制代码
mount -o remount,rw /
passwd root

密码改完之后,重启系统:

bash 复制代码
exec /sbin/init
# 或者直接强制重启
reboot -f

Debian 12/13 的操作:

Debian的操作跟Ubuntu差不多,但Debian 13稍微有点变化,它的GRUB配置界面可能不太一样。

同样是重启进GRUB,按e编辑,找到linux那行,在行尾加上init=/bin/bash,然后按Ctrl+X启动。

进入shell后:

bash 复制代码
# 先确保根目录可写
mount -o remount,rw /
# 修改密码
passwd root
# 重启
exec /sbin/init

这里有个坑,Debian 13有时候默认不安装/sbin/init这个路径,如果执行报错,可以试试:

bash 复制代码
/sbin/reboot -f

或者直接在虚拟化管理界面强制重启。

2.2 RedHat/CentOS/Rocky/Alma 系列的救援模式

红帽系的系统操作稍微不太一样,它有个专门的救援模式可以用。

CentOS 7/8/9、Rocky Linux 8/9、AlmaLinux 8/9 的操作:

重启系统,在GRUB菜单选择内核的时候,按e进入编辑模式。

找到以linux16linux开头的那一行,在末尾加上rd.break

Ctrl+X启动,系统会进入紧急模式。

这时候系统会挂载/sysroot目录,但是只读的,要先重新挂载:

bash 复制代码
mount -o remount,rw /sysroot

然后切换到chroot环境:

bash 复制代码
chroot /sysroot

修改密码:

bash 复制代码
passwd root

这里有个重要步骤,SELinux的标签要重置,否则重启后可能登录不了:

bash 复制代码
touch /.autorelabel

最后退出并重启:

bash 复制代码
exit
exit

系统会自动重启,第一次启动可能会花点时间重置SELinux标签,耐心等待就好。

RHEL 8/9 的操作:

RHEL的操作跟CentOS基本一致,但如果你有订阅账号,还可以用官方的救援镜像。通过订阅管理的Red Hat Customer Portal可以下载救援ISO,挂载启动后选择Rescue installed system,它会自动找到你的系统并挂载,然后你chroot进去改密码就行。

不过说实话,大多数情况下用GRUB编辑的方法就够了,不需要专门去搞救援镜像。

2.3 使用Live CD/USB重置密码

如果单用户模式进不去,或者GRUB被加密了,可以用Live CD/USB启动系统,然后手动挂载磁盘改密码。

找个同架构的Linux Live CD,比如Ubuntu Live或者SystemRescueCd,启动后进入shell。

查看磁盘分区:

bash 复制代码
fdisk -l
# 或者
lsblk

找到原来的根分区,挂载:

bash 复制代码
mkdir /mnt/root
mount /dev/sda2 /mnt/root  # 假设根分区是sda2

切换到chroot环境:

bash 复制代码
chroot /mnt/root
passwd root
exit

重启后用新密码登录即可。

云服务器密码重置

云服务器的情况稍微复杂一点,因为你看不到真正的控制台,但云厂商一般都提供了密码重置功能,而且操作起来比物理机方便多了。

3.1 阿里云ECS

阿里云的密码重置算是比较方便的,有两种方式。

方式一:控制台重置

登录阿里云控制台,进入ECS实例列表,找到目标实例。如果实例是运行状态,可以直接点击「更多」→「密码/密钥」→「重置实例密码」。

输入新密码,确认后,如果是运行中的实例,需要重启才能生效。如果实例是停止状态,密码会立即生效。

这里有个细节要注意,如果你的实例是经典网络类型,重置密码后可能需要重启才能生效;如果是VPC类型,有些情况下不需要重启。

方式二:VNC远程连接

如果控制台重置密码的功能用不了(比如实例状态异常),可以用VNC远程连接。

在实例详情页,点击「远程连接」,选择VNC方式。如果是第一次使用,会提示设置VNC密码,这个密码跟系统密码不是一回事,要区分开。

连接上去后,就跟操作本地虚拟机一样了,可以用前面说的单用户模式重置密码。

不过说实话,阿里云的密码重置功能已经很完善了,大多数情况下用控制台直接重置就行,没必要折腾VNC。

3.2 腾讯云CVM

腾讯云的操作跟阿里云差不多,也是控制台直接重置。

登录腾讯云控制台,进入云服务器CVM列表,找到目标实例。点击「更多」→「密码/密钥」→「重置密码」。

输入新密码,确认后,如果实例在运行,系统会提示需要重启才能生效。

腾讯云有个地方要注意,如果你设置的是密钥对登录,密码登录可能会被禁用,这时候需要先把密码登录开启。在「登录设置」里可以修改。

另外,腾讯云的VNC连接叫「标准登录」或「OrcaTerm」,在实例列表点击「登录」就能选择。

3.3 华为云ECS

华为云的密码重置也差不多,控制台找到实例,「更多」→「重置密码」。

不过华为云有个特色功能叫「一键重置密码插件」,需要在创建实例时安装。如果创建时没装这个插件,控制台的重置密码功能可能用不了,需要用其他方式。

如果没有安装一键重置密码插件,可以:

  1. 关机实例
  2. 进入「镜像服务」,使用该实例创建镜像
  3. 用新镜像创建实例时设置新密码

或者更简单的方法,使用云服务器控制台的「远程登录」功能,通过VNC连接进去,用单用户模式重置。

3.4 AWS EC2

AWS的密码重置方式有点不太一样,因为EC2默认是用密钥对登录的,密码登录默认是关闭的。

如果是Amazon Linux或者RHEL之类的系统,可以用以下方式:

方式一:EC2 Serial Console

如果实例支持Serial Console访问,可以在控制台启用。EC2 Serial Console允许你通过串口连接到实例,然后可以用单用户模式重置密码。

不过这个功能需要在实例上启用,而且需要实例支持。查看实例类型是否支持Nitro系统,大多数新实例都支持。

方式二:使用用户数据脚本

停止实例,修改用户数据,添加以下脚本:

bash 复制代码
Content-Type: text/cloud-config
#cloud-config
password: YourNewPassword
chpasswd: { expire: False }
ssh_pwauth: True

启动实例后,密码就会生效。但这种方式只在实例首次启动或者用户数据变化后首次启动时执行。

方式三:挂载根卷到另一个实例

停止目标实例,在控制台分离根卷(通常是/dev/xvda/dev/sda1)。

把分离出来的卷挂载到另一个可以访问的EC2实例上,挂载后chroot进去改密码,或者直接修改/etc/shadow文件。

改完后,重新挂载回原实例,启动即可。

这个方法比较麻烦,但是最可靠,几乎所有Linux发行版都适用。

3.5 Azure虚拟机

Azure VM的密码重置也有几种方式。

方式一:Azure Portal重置

登录Azure Portal,找到目标虚拟机,在左侧菜单找到「重置密码」。输入新用户名和密码,点击「更新」即可。

这个功能底层是使用VM Agent执行的,如果VM Agent没装或者不工作,这个方法就没法用了。

方式二:使用Run Command

Azure有个功能叫Run Command,可以在不登录的情况下执行命令。

在虚拟机页面,找到「运行命令」,选择RunShellScript,然后输入:

bash 复制代码
echo "root:YourNewPassword" | chpasswd

点击运行,等待执行完成。

方式三:使用Serial Console

Azure也支持Serial Console访问,在虚拟机页面找到「串行控制台」,连接后就可以像本地控制台一样操作了。

进入GRUB后,用单用户模式重置密码即可。

3.6 其他云厂商

天翼云、移动云、联通云等运营商云的操作大同小异,都是控制台找到实例,点击重置密码,输入新密码,重启生效。

京东云、百度云、金山云等也是类似的操作流程,就不一一赘述了。

容器环境的密码重置?

有人可能会问,Docker容器里的Linux密码忘了怎么办?

这个其实不是问题,容器本身就不应该有密码登录的概念。容器的正确使用方式是通过docker exec或者kubectl exec进入容器,不需要密码。

如果真要在容器里设置密码,也是改镜像或者持久化存储里的配置,而不是在运行中的容器里改。

预防措施

说完了怎么解决问题,再聊聊怎么预防。

首先,密码管理工具用起来。不管是公司里的密码管理系统,还是个人的1Password、Bitwarden之类的,都比记在脑子里或者写在便签纸上靠谱。

其次,SSH密钥对登录优先。密码容易忘,密钥不会忘,而且更安全。但要注意私钥要备份好,丢了比密码忘了还麻烦。

第三,堡垒机或者跳板机用起来。通过堡垒机登录服务器,堡垒机上可以设置密码代填,不用记住每台服务器的密码。

第四,文档要跟上。新服务器上线,密码要及时记录;交接的时候,文档要完整。这些都是运维的基本功。

第五,定期巡检。时不时登录一下不常用的服务器,确认账号密码是否正确,有问题早发现早解决。

一些踩过的坑

最后分享几个我遇到过的坑。

一次是给客户重置密码,改完之后死活登录不上,排查了半天发现是SELinux标签没重置,重启后验证通不过,登录被拒绝。从此以后,红帽系的系统改密码必执行touch /.autorelabel

还有一次,云服务器控制台重置密码,等了半天没生效,结果发现实例是停止状态下的重置,密码设置了但没重启,等了半天白等。所以现在如果实例是停止的,先启动,再确认密码是否生效。

最坑的一次是接手一台老服务器,用各种方法都进不去,最后发现GRUB被加密了,密码不知道。这种情况下只能用Live CD启动,挂载磁盘改/etc/shadow文件。从那以后,我都习惯问一下之前的运维有没有给GRUB加密。

总结

密码忘记这事儿,说大不大,说小不小,关键是要知道怎么处理。

物理机和虚拟机,单用户模式和Live CD是两大法宝;云服务器,控制台重置密码是最方便的方式;实在不行,VNC和Serial Console能救急。

当然,最好的办法还是做好密码管理,别让自己陷入这种窘境。

希望这篇文章能帮到有需要的朋友,有问题可以在评论区留言交流。


个人博客:躬行笔记

如果这篇文章对你有帮助,欢迎关注转发,你的支持是我持续输出的动力!

相关推荐
A小辣椒1 天前
TShark:Wireshark CLI 功能
linux
A小辣椒1 天前
TShark:基础知识
linux
AlfredZhao1 天前
OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G?
linux·oci
AlfredZhao2 天前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户9718356334662 天前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪2 天前
linux 拷贝文件或目录到指定的位置
linux
大树883 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠3 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质3 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
bush43 天前
嵌入式linux学习记录十四、术语
linux·嵌入式