虚拟机SSH密码忘了,最直接的办法是进入单用户模式或使用救援模式重置密码,整个过程只需几分钟。这个办法适用于绝大多数Linux发行版,不依赖任何第三方工具,也不需要重装系统,下面把几种主流场景的解决路径一次讲清楚,按操作难度从低到高排列,可以对照自己的环境直接上手。
虚拟机SSH密码重置前的准备清单
动手之前先确认三件事,能省下不少返工时间,第一,你有虚拟机的管理控制台权限,比如VMware vSphere、VirtualBox、KVM的图形界面,或者云服务商的网页VNC终端,第二,虚拟机当前处于关机状态,或者至少允许你重启,第三,记录一下系统类型和版本,是Ubuntu、CentOS、Debian还是其他发行版,不同系统的引导参数写法略有差异。
操作顺序是:先通过虚拟机管理端进入启动菜单,修改内核启动参数,进入单用户模式或紧急模式,然后直接修改密码,整个过程不涉及SSH服务本身,因为还没有登录系统。
通过grub引导进入单用户模式改密码
这是最经典、适用性最广的路径,无论虚拟机里装的是哪个Linux版本,只要能看到GRUB引导菜单,基本都能操作。
重启虚拟机并中断引导过程
在虚拟机管理界面点击重启,立刻用鼠标点击屏幕抓住焦点,在GRUB菜单出现的瞬间按一个键,通常是e键进入编辑模式,部分系统按Esc或Shift,如果错过了时机没进菜单,再重启一次,手速可以快一点,有些云厂商的VNC控制台响应有延迟,建议连续按几次e。
修改内核启动参数进入rescue模式
在GRUB编辑界面里,找到以linux或linux16开头的那一行,这行参数定义内核如何启动,定位到行末,找到ro这个参数,它表示以只读方式挂载根文件系统,把它改成rw init=/bin/bash,完整效果是让系统以读写方式挂载根分区,并直接启动一个Bash Shell代替正常的init进程。
具体操作用箭头键移到行尾,删掉ro,输入rw init=/bin/bash,注意有些系统默认没有ro而是quiet splash,保留其他参数,只追加上述内容即可。
在bash环境下重置root或普通用户密码
按Ctrl+X或F10启动引导,等待几秒后你会看到一个类似bash-4.2#的提示符,这就是根文件系统挂载好的单用户Shell,此时直接输入:
passwd root
系统会提示输入两次新密码,如果要把普通用户密码也重置,比如用户名是

ubuntu,就输入passwd ubuntu。
设置完成后,执行exec /sbin/init或reboot -f重启系统,如果重启失败,可以输入exit退出Shell,再按Ctrl+Alt+Del重启,正常进入系统后,新密码立即生效,SSH登录时用新密码即可。
不同Linux发行版下的具体差异
虽然通用方法在大多数系统上有效,但Debian系和Red Hat系在细节上有些区别,尤其是在旧版本或特殊配置上。
Ubuntu和Debian系系统的处理方式
Ubuntu Server和Debian的GRUB菜单默认有子菜单,Advanced options for Ubuntu”,进入编辑模式前先展开子菜单,找到带(recovery mode)字样的内核条目,按e编辑,如果用这个条目,可以绕过手动写init=/bin/bash的步骤,恢复菜单里直接有“root Drop to a root shell”选项。
另一个需要注意的点是AppArmor和SELinux干扰,在Debian系系统上,进入单用户模式后有时会遇到SELinux策略阻止修改密码的情况,但Ubuntu默认不启用SELinux,所以问题不大。
修改密码后建议执行:
touch /.autorelabel
这个命令在基于SELinux的系统上用于触发重新标记文件上下文,CentOS/RHEL系统在单用户模式改密码后如果不做这步,可能会遇到SELinux拒绝写入的问题而登录失败。
CentOS/RHEL和Rocky Linux的专用命令
CentOS 7版本和Rocky Linux的GRUB编辑方式和上面完全一致,但在进入bash后,建议先检查根分区是否真的可写:
mount -o remount,rw /
有些最小化安装场景下即使加了rw参数,根分区依然是只读状态,执行这条命令确保可写后再运行passwd。
CentOS的grub菜单默认会隐藏,开机时长按Shift或Esc可以弹出,虚拟机环境下如果按键无效,检查虚拟机设置中是否开启了“引导时显示GRUB菜单”的选项。
使用systemd的emergency模式替代传统方法
现代Linux发行版几乎都用systemd,除了修改内核参数直接进bash,还有一条更标准的路径:在GRUB编辑时把参数改成systemd.unit=emergency.target,或者先正常启动,在登录界面按Ctrl+Alt+Del前强行中断,输入systemctl rescue。
emergency模式会提示输入root密码,如果root密码也忘了,就依然需要用init=/bin/bash方式,在emergency模式下执行:
mount -o remount,rw / passwd root systemctl default

这样可以回到正常启动流程,经验之谈,emergency路径在处理带有LVM或加密分区时更稳妥,因为systemd会先加载必要的驱动。
虚拟机快照或克隆是最快的备用方案
如果虚拟机里运行着重要服务,手里又没有现成的密码管理工具,重置密码有更省心的替代方案,前提是你之前创建过快照或克隆,在VMware Workstation或VirtualBox里,右键虚拟机选择“快照”,回到之前的可用状态,再进入系统把密码更新掉,国内运维圈子里习惯把这种做法叫“回滚”,在时间点选择上越接近忘记密码前越好。
这套方案对数据库虚拟机、应用服务器特别实用,假设一台上线半年的CentOS虚拟机SSH密码遗失,但两周前的快照还在,直接回滚到两周前,先做数据备份,再重置密码,业务中断时间能控制在几分钟内,不过快照恢复会丢失这段时间内的数据变更,用于测试环境可以,生产环境建议优先用单用户模式。
云服务器和虚拟主机的密码找回入口
自建虚拟机用上面grub方法没问题,但简米云、酷番云、华为云上的云服务器虚拟机,往往是经过定制的系统镜像,grub菜单被隐藏或修改过,直接按键中断不一定奏效。
这些平台的常规做法是使用控制台提供的“重置实例密码”功能,在云服务器管理页面找到目标实例,点击“更多”下拉菜单,选择“密码/密钥”,再选“重置密码”,要求输入新密码后强制重启生效,这个操作不需要登录系统,通过底层虚拟化接口完成,原理相当于直接在镜像层面改密码,比grub方法更底层。
如果是酷番云轻量应用服务器这类成本较低的套餐,控制台里也有类似的“重置密码”按钮,再次强调,重置前检查一下是否设置了密钥对,如果同时绑定了密钥和密码,密码重置后密钥依然有效,SSH连接行为不会变化。
物理机和虚拟机操作的核心区别
很多人把虚拟机密码修改方式和对物理机混为一谈,物理机上忘记root密码,同样通过grub进入单用户模式,但物理机需要在开机时手动按键,且遇到磁盘加密(LUKS)时需要额外处理,虚拟机相比有两个天然优势:一是可以通过管理程序发送重启或强制关机指令,永远不会出现按不到键的尴尬;二是可以挂载ISO镜像启动救援系统,比单用户模式更没有侵入性。
如果单用户模式操作失败,虚拟机救援模式的兜底方案是:关闭虚拟机,在虚拟光驱里挂载一个Linux LiveCD或系统安装盘,从光驱启动,把原系统磁盘挂载到/mnt,然后用

chroot进入原系统环境执行passwd,以CentOS安装盘为例,启动盘进入“Troubleshooting”菜单,选“Rescue a CentOS system”,系统检测到根分区后自动挂载,按chroot /mnt/sysimage进入环境,再运行passwd,有了chroot这一层保障,就算grub参数写错了也有退路。
常见问题解答
虚拟机SSH密码重置后ssh服务无法启动怎么办?
重置密码后如果SSH登录时提示“Connection refused”或“Permission denied”,先确认sshd服务状态,在系统内执行systemctl status sshd查看服务是否运行,如果没运行就执行systemctl start sshd,同时检查/etc/ssh/sshd_config中PasswordAuthentication是否为yes,若为no,密码模式登录会被禁止,需要改为yes并重启服务,另外检查防火墙放行22端口,云安全组规则也要放开入方向的TCP 22端口。
虚拟机SSH密码忘了但root密码没忘,能直接重置普通用户密码吗?
如果root密码知道,登录root或执行sudo passwd 用户名即可直接重置,不需要走grub流程,前提是普通用户在sudoers文件中有提权权限,若该用户不在sudoers列表里,可以先用root在终端里修改,或者编辑/etc/sudoers文件把用户加进去,日常运维中建议为每个管理员保留一个独立的sudo账号,避免所有业务都依赖root密码,这样单点遗失密码不至于影响整体运维。
进入单用户模式后文件系统仍然是只读状态该怎么处理?
在bash提示符下输入mount -o remount,rw /重新挂载根分区,如果根分区包含LVM逻辑卷或特殊挂载选项,可以先查看mount输出确认设备名,再针对设备挂载,对于加密磁盘,在grub引导时需提前输入键盘密码,进入bash后还要执行cryptsetup luksOpen /dev/sda5 luksroot将加密卷映射出来,然后挂载/dev/mapper/luksroot,处理完密码后执行reboot -f重启,重启时加密密码会正常请求,并不会影响体验。
最后把方案收拢一下:虚拟机的SSH密码忘了,优先尝试GRUB编辑加rw init=/bin/bash进入bash重置密码,此法适用于所有主流Linux发行版,如果控制台提供重置密码功能,这是云虚拟机最快的方式,两种方式都行不通时,用快照回滚或LiveCD救援,密码管理习惯大于事后补救,建议平时把全管理员密码放入自建密码库或者密钥SSH登录,毕竟密钥认证本身就比密码方式更安全,一旦配置好,连密码都可以忘掉。