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

虚拟机密码忘了怎么办?Linux与Windows全场景重置指南

虚拟机密码忘了怎么办?Linux与Windows全场景重置指南 ★ FEATURED ARTICLE
干虚拟机和运维这些年被问到最多的问题之一就是虚拟机密码忘了怎么办。VMware Workstation里跑着的Ubuntu开发机密码过期进不去系统ESXi上托管的一台CentOS root密码想不起来接手同事移交的虚拟机却没人知道登录口令……这类场景我几乎每个月都会碰到。很多人第一反应是重装系统代价太大。今天就把虚拟机密码修改这件事讲透Linux、Windows、个人Workstation、企业vSphere每种场景给一条能直接照做的路径。所有操作都有一个明确前提——这台虚拟机是你自己的或者由你负责维护属于密码丢失后的合法恢复操作。1. 先搞清楚虚拟机密码为什么会变成“拦路虎”1.1 四个高频场景对号入座第一个场景是纯遗忘。测试环境或实验室虚拟机安装系统时随手设了个密码三个月后要用怎么也想不起来。这种情况最普遍也是最好解决的因为系统本身没坏只是访问凭证丢了。第二个场景是密码过期。公司策略或本地安全策略配置了最大有效期比如强制90天更换密码。如果机器不常登到期后再登录就会卡在“密码已过期”的提示上。更麻烦的是很多SSH服务默认会拒绝密码已过期的账户远程连接结果就变成从外面进不来、进图形界面又必须改密码的死循环。第三个场景是接手旧资产。别人交付的虚拟机文档里没写密码原管理员早就离职。生产环境里遇到这种问题往往还要额外处理SELinux、磁盘加密等变量操作前必须先判断系统的复杂程度。第四个场景是密码策略反过来“坑”了自己。我见过有人把密码复杂度调到最高、历史记录设为5条结果自己想改回简单密码时被策略卡住最后只能借助救援模式。先判断自己属于哪一类再往下选方案效率会高很多。1.2 开工前说清三件事动手之前有件事必须反复强调虚拟机密码修改的思路和物理机在本质上是相通的但虚拟机有一个物理机羡慕不来的优势——磁盘本质上就是一个文件可以随意挂载、拆卸、加设备、改启动参数。这意味着很多在物理机上需要拆机、刻盘才能完成的动作在虚拟机里几分钟就能搞定。在动任何系统文件之前一定要拍快照。VMware Workstation的快照能在几秒内保存当前状态哪怕把系统搞到无法启动也能一键回到修改前。我见过太多人自信满满直接改shadow文件改坏了只能从头装系统这完全可以通过一个快照避免。企业vSphere环境里快照成本高一点但在重大变更前创建临时快照操作完再删掉依然是值得养成的习惯。另外提前准备好目标系统的安装镜像ISO。Linux发行版镜像通常自带救援或恢复模式Windows安装介质则能让后续的命令行操作派上用场。镜像版本不要求和系统完全一致但尽量用同大版本减少内核或库文件不兼容导致的中途失败。2. Linux虚拟机重置密码四种方案按需选2.1 单用户模式能进GRUB就能救这是Linux系最简单、最通用的方法适用于Ubuntu、Debian以及大多数衍生发行版操作门槛很低。只要虚拟机还能弹出GRUB菜单理论上来讲密码就能救回来。步骤看起来不长但每一步都有讲究启动虚拟机在GRUB菜单出现时快速按字母e进入编辑模式。找到以linux开头的那一行把其中的ro改成rw并在行尾加上single。按CtrlX或F10启动系统会进入单用户shell。此时你已经是root身份直接执行passwd目标用户名输入两次新密码。输入reboot重启虚拟机。为什么要把ro改成rw因为如果不改根文件系统在救援阶段是以只读方式挂载的执行passwd会直接报“Read-only file system”错误密码根本没写进去。这个细节是新手最容易忽略的坑也是改完密码却没生效的最常见原因。对于Ubuntu系统还有一个变体在GRUB菜单中选择“Advanced options for Ubuntu”进入recovery mode然后选择“root - Drop to root shell prompt”。进入后如果发现文件系统仍是只读先执行mount -o remount,rw /再做密码修改。Ubuntu默认禁用root账户密码普通用户靠sudo提权。如果忘记的是普通用户密码直接在单用户shell里passwd用户名即可如果root密码也想不起来就先给root设置一个新密码再通过su切换身份去处理其他用户。2.2 rd.break与init/bin/bashCentOS/RHEL系的老牌方案CentOS 7及RHEL系用单用户模式有时不够干净我更习惯用rd.break参数。它的原理是系统启动阶段进入dracut的紧急shell此时真正的根文件系统还没有完整挂载但你可以手动挂载并chroot进去得到一个干扰更少的修改环境。在GRUB编辑界面找到linux16开头的那一行新版GRUB也可能是linux在行尾添加rd.break。按CtrlX启动等待进入dracut提示符。执行mount -o remount,rw /sysroot让根文件系统变为可写。执行chroot /sysroot进入目标系统环境。执行passwd root或passwd目标用户名输入新密码。执行touch /.autorelabel创建SELinux自动重标记标志文件。输入两次exit退出chroot并继续启动系统会自动完成重启。rd.break与单用户模式的区别在于介入时机不同它更“底层”系统服务尚未启动受异常状态影响的可能性更小。还有一种init/bin/bash的写法——在linux行尾加init/bin/bash同时确保ro改成rw启动后会直接进入bash shell。这种方式更简陋有些命令不在PATH里修改完用reboot不一定生效需要reboot -f。我个人的建议是优先用rd.break可控性更好也不容易踩到SELinux的坑单用户模式适合快速改密码init/bin/bash则适合其他参数都无效时的临场尝试。方案适用版本关键动作SELinux处理适合场景单用户模式Ubuntu/Debian/多数发行版linux行加single一般无需处理新手首选rd.breakCentOS 7/8、RHELlinux16行加rd.break需touch /.autorelabel需要干净环境init/bin/bash各版本临时应急linux行加init/bin/bash需touch /.autorelabel快速介入拆盘挂载法必须能停机磁盘挂到另一台虚拟机需restorecon或relabel系统完全起不来2.3 拆盘挂载法虚拟机独有的“特权操作”有时候系统已经彻底起不来——开机黑屏、内核panic、GRUB损坏单用户模式也无从谈起。这时虚拟机的磁盘文件化优势就体现出来了直接把出问题的虚拟硬盘挂到另一台正常的虚拟机里进行操作。将目标虚拟机正常关机记住它的硬盘文件路径比如.vmdk。打开一台临时虚拟机系统尽量和目标机同发行版比如目标机是CentOS就用CentOS。在虚拟机设置里添加一块“现有磁盘”选择目标虚拟机目录下的vmdk文件。开机后执行fdisk -l或lsblk查看新增磁盘设备名比如/dev/sdb。挂载根分区例如mount /dev/sdb1 /mnt具体分区号按实际布局调整。把/proc、/sys、/dev同步绑定到挂载点mount --bind /proc /mnt/procmount --bind /sys /mnt/sysmount --bind /dev /mnt/dev。执行chroot /mnt进入目标系统环境。执行passwd目标用户名完成密码修改。如果目标系统开启了SELinux在chroot内执行restorecon -v /etc/shadow恢复文件上下文或者直接touch /.autorelabel让系统在下次启动时自动处理。退出chroot卸载所有挂载点关机后把这块磁盘从临时虚拟机上移除再启动原虚拟机。还有一个变体不进入chroot直接修改目标系统的/etc/shadow文件通过openssl passwd -6 新密码生成SHA-512哈希替换shadow中对应的密码字段。这个方法对shadow格式和文件权限要求都很高改错了系统可能直接无法启动。我只推荐给对shadow格式非常熟悉的人新手中招的概率远大于收益。2.4 顺手把密码过期策略一起解决改完密码却发现登录后反复提示密码过期与其下次再被锁在门外不如把策略一起处理掉。查看用户密码策略chage -l 用户名输出里会显示上次修改时间、密码过期时间、两次修改最小间隔等信息。取消过期限制chage -M -1 用户名-M参数指定最大有效天数-1代表永不过期。如果密码已经过期想强制用户在下一次登录时修改用chage -d 0 用户名把上次修改日期设为0系统会在用户下次登录时强制要求设置新密码。企业环境里要提前通知用户密码即将到期可以写一个检查脚本配合cron每天运行#!/bin/bash # 检查未来7天内过期的账户脚本需以root运行 now$(date %s) awk -F: $2!! $2!* {print $1, $3, $5} /etc/shadow | while read user last max; do [ -z $max ] continue expire_epoch$(( (last max) * 86400 )) warn_epoch$(( expire_epoch - 7 * 86400 )) if [ $now -ge $warn_epoch ] [ $now -lt $expire_epoch ]; then echo $user 的密码将在7天内过期请尽快修改 fi done脚本中跳过以!或*开头的密码字段是因为这些账户要么被锁定要么不允许密码登录。把脚本接到邮件或消息推送渠道就能把“密码过期”从突发事故变成日常提醒。2.5 我的Linux方案选型心得方案多不代表都要记重点是要知道每种方案适合什么场景。拿不准的时候先拍快照再在测试虚拟机里把命令跑一遍确认没问题再上生产机。互相比较下来能进GRUB就单用户CentOS系优先rd.break系统坏到起不来的就拆盘挂载改完密码永远不要忘记SELinux的autorelabel标记。这四个判断做出来Linux密码问题基本就不慌了。3. Windows虚拟机忘记密码两条路都能走3.1 安装镜像“轻松使用”按钮改密码Windows虚拟机没有单用户shell可用最常用的恢复途径是借助安装介质临时替换一个辅助工具再通过登录界面触发它。挂载Windows安装ISO在虚拟机光驱设置里勾选“启动时连接”确保从光驱引导。启动虚拟机进入安装界面按ShiftF10调出命令行。在命令行输入notepad打开记事本用“文件-打开”功能找到真正的系统盘安装环境里不一定是C:可能是D:确认Windows\System32目录存在。在命令行中执行move D:\Windows\System32\utilman.exe D:\Windows\System32\utilman.exe.bak copy D:\Windows\System32\cmd.exe D:\Windows\System32\utilman.exe执行wpeutil reboot重启虚拟机注意不要在安装向导里继续操作。系统正常启动到登录界面后点击右下角的“轻松使用”图标弹出的其实是一个system权限的命令行窗口。在命令行中执行net user查看用户列表再执行net user 用户名 新密码完成修改。重启后使用新密码登录测试。为什么要替换utilman.exe而不是其他文件因为登录界面的“轻松使用”按钮本身是在输入凭证之前以系统权限运行的用户可以直接点击。把它替换成cmd.exe就相当于在登录前拿到了一个高权限命令行窗口。这个方法的局限性需要讲清楚它只对本地账户有效。如果登录的是微软在线账户本地改密码不会同步到云端账号重启后依然需要原密码这种情况只能先去官网改密码或者改用本地账户。另外BitLocker加密的系统盘在这一招面前完全无效——解密之前命令行根本读不到加密卷的内容。处理完后建议把utilman.exe还原因为这个位置等同于系统留下的特权入口不还原等于把登录界面变成了一个可以随时调出高权限命令行的口子。这个方法本身不复杂但请把它用在正途上只恢复你自己权限范围内设备的访问权。3.2 高级备选用密码恢复引导盘改SAMWindows密码保存在SAM注册表文件里系统运行时文件被锁定但关机状态下可以被读取。比手动编辑更稳妥的做法是用一些基于Linux的密码恢复引导盘启动虚拟机在图形化界面里直接修改SAM数据库。这类工具本质上和前面替换utilman的思路是一样的都是绕过登录认证、在数据层面修改密码只是交互方式更友好。需要记住的是手动编辑SAM文件比Linux的shadow危险得多文件有特殊格式和校验用文本编辑器直接改几乎必然损坏系统所以我不建议手动操作。选择这类引导盘时务必从可信渠道下载并且在测试虚拟机里先验证一遍再碰生产环境。4. 企业环境下的虚拟机密码重置细节4.1 托管在ESXi/vCenter上的虚拟机怎么操作vSphere环境里虚拟机跑在远程ESXi主机上不如本地Workstation方便但密码重置的核心逻辑完全一样区别只在入口和操作方式。有两个细节最容易出问题。第一挂载ISO时要进入虚拟机的“编辑设置”把ISO附加到CD/DVD驱动器并且勾选“打开电源时连接”。很多人在这里漏掉勾选结果虚拟机重启后根本没识别到光驱白折腾一圈。第二引导顺序未必默认是光驱优先需要在虚拟机BIOS/EFI设置中调整或者在开机画面快速按键调出引导菜单。常见BIOS按Esc或F2UEFI环境通常是在该界面里手动选择一次启动设备。进入救援环境后的流程和在物理机上一致。Linux虚拟机用ISO引导后选择“Rescue a broken system”按提示挂载根分区、chroot、passwd。ESXi控制台的按键捕获和粘贴比本地方便程度差一截Web控制台需要点击页面上方的“发送按键”或手动选择粘贴入口这部分我在下一章详细说。企业场景里还有一个更简单的思路如果虚拟机有完整备份且允许几分钟的停机直接从备份恢复或克隆一台新虚拟机有时候比重修密码更快。密码忘了是访问凭证问题不是系统损坏问题评估一下停机成本和操作风险再决定方案。4.2 国产系统麒麟/UOS系的密码重置差异国产操作系统在政企环境里越来越常见密码重置的逻辑和Linux系源头一脉相承不需要额外恐惧。银河麒麟V10桌面版与Ubuntu同源GRUB编辑、recovery mode、single参数这些操作完全适用部分服务器版底子是CentOS系rd.break反而更顺手。有两个差异要特别留意。第一有些国产发行版默认不显示GRUB菜单开机时需要连续按Esc或Shift键才能调出引导入口否则连编辑的地方都找不到。第二多数系统默认禁用root密码登录但图形界面允许普通用户登录修改前一定要弄清目标是root还是普通用户避免改了半天的密码不对应。我在实际测试中还发现个别版本对GRUB参数做了简化直接加single可能不生效。这种情况优先尝试recovery mode入口或者干脆使用拆盘挂载法。不管走哪条路先快照再操作都是铁律。4.3 企业服务器别忘了“密码过期提醒”很多企业Linux服务器都开启了密码过期策略策略本身没错缺的是配套提醒机制。没有提醒就会出现“管理员被自己的策略锁在门外”的尴尬局面。解决方案有两个方向。一是直接调整全局策略比如修改/etc/login.defs里的PASS_MAX_DAYS为合理值二是用前面2.4节的脚本定期检查shadow文件把剩余7天内到期的用户列出来并发邮件推送。提醒脚本的逻辑就三件事读取每个用户上次修改密码日期和最大有效天数计算到期时间把临近过期的用户通知出去配合cron每天跑一次。投入很小但能极大减少“密码过期忘密码”的应急工单。5. 实测中踩过的坑和排查思路5.1 改完密码登录依旧失败的几个原因第一个坑是SELinux。CentOS系在改完shadow之后如果没有touch /.autorelabel重启后SELinux会阻止登录相关的正常读取表现通常是卡在登录界面或者SSH一直拒绝密码。其实密码是对的问题出在安全上下文标签错乱。解决办法就是回到救援模式执行touch /.autorelabel重启时系统会自动重新打标签。第二个坑是根文件系统只读。很多人按教程进入单用户后直接passwd提示成功但一重启密码根本没变因为ro没有改成rw修改内容没有真正落盘。验证方法很简单执行mount | grep / 看挂载选项确认是rw再继续操作。第三个坑是PAM策略。单用户模式下passwd同样会触发PAM认证模块如果新密码不满足复杂度、长度或历史记录要求passwd会直接报错。想快速解决可以按照现有策略设置一个合规密码或者进入救援模式后临时调整/etc/security/pwquality.conf相关的复杂度参数。第四个坑是shadow文件权限被改坏了。拆盘挂载时如果直接在宿主机上编辑shadow文件很可能把属主改成了宿主机的uid目标系统启动时拒绝读取。恢复方式是在目标系统环境内执行chown root:shadow /etc/shadow然后chmod 640 /etc/shadow。5.2 磁盘加密与快照关键时刻能保命如果目标虚拟机启用了LUKS全盘加密或Windows的BitLocker前面所有密码重置方案都会失效。因为这些方案的本质都是通过替换或修改认证数据来绕过登录而加密状态下所有内容是密文根本无法定位要修改的文件。遇到这种情况只能在控制台输入原有的加密锁密码才能继续。如果连加密密码也忘了任何技术手段都救不了只能靠备份恢复或快照回滚。这也是我反复强调快照的原因。Workstation本地快照几秒就能建好出现问题几秒回滚vSphere快照成本稍微高一些但重大变更前创建、操作完删除仍然是性价比最高的保险手段。5.3 控制台操作的细节能气死人虚拟机控制台的交互细节在各类教程里很少有人写但实际踩坑率很高。GRUB菜单按e没反应大概率是虚拟机窗口没有聚焦。VMware Workstation里需要先点击虚拟机窗口内部让键盘捕获生效再按e。ESXi的Web控制台如果按键异常可以点控制台页面上的“发送键”按钮或者使用工具栏里的“CtrlAltDel”入口。救援shell里的复制粘贴也容易出问题。Workstation中可以用CtrlShiftV直接粘贴但宿主机快捷键容易冲突ESXi Web控制台通常要点击页面工具栏的粘贴图标或者鼠标右键选Paste。我的习惯是在本地编辑器里先把完整命令写好一次性粘进去避免逐字输入出错。键盘布局是一个容易被忽略的大坑。救援环境默认美式键盘布局如果你的新密码包含、#这些符号会因为布局差异输成完全不同的字符。最稳妥的办法是临时把密码设置成纯字母加数字的组合登录成功后再用passwd改成正式密码。rd.break过程中有人按CtrlD觉得“没反应”其实是顺序错了。进入dracut shell后正确的流程是先完成chroot内的密码修改再连续输入两次exit退出系统才会继续启动。如果没有做任何操作就按CtrlD系统只是重新挂载看起来就像卡死一样。5.4 常见问题速查表现象可能原因处理思路单用户模式passwd提示只读文件系统根分区以ro挂载重挂载为rw或修改GRUB参数改完CentOS密码仍进不去SELinux上下文错误救援模式touch /.autorelabelWindows替换utilman后无法调出cmd系统盘符判断错误用notepad确认Windows目录位置密码过期后SSH登录被拒PAM策略禁止过期密码远程登录用控制台或救援模式处理GRUB编辑后无法启动内核参数写错位置按e重新检查linux行拆盘挂载后chroot提示command not found没有绑定必要的系统目录mount --bind /proc /sys /dev折腾这么多虚拟机密码问题我最大的体会是所谓密码重置方案本质上都是围绕“拿到一个能改账号数据的shell”和“保证文件系统可写”这两件事展开的剩下的全是细节差异。而虚拟机最大的底气来自快照和磁盘的可挂载特性这给了我们比物理机高得多的容错率。我自己用这套方法在测试机和企业虚拟机上做过无数回密码恢复成功率虽然不敢说百分之百但只要没做全盘加密、提前拍了快照基本都能全身而退。最后再提醒一句改完密码一定要当场测试登录确认无误再关闭救援环境别急着收工——我有一次就是改完就关第二天用户反馈还是登不上一查才发现SELinux的autorelabel根本没生效又得重新折腾一遍。
阅读完成 · 觉得有帮助?
咨询建站