ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

root密码忘记别慌:Linux与MySQL密码重置实操指南

root密码忘记别慌:Linux与MySQL密码重置实操指南 干了这么多年运维“root 密码忘了”这六个字我大概听了不下五十次。每次接到这种求助对方都是一脸急系统进不去、数据库连不上、线上服务瘫着而我又不能直接把密码告诉对方。今天心血来潮把手头几个主流场景的 root 密码重置方法整理成一篇完整实操包括 Linux 系统层、MySQL/MariaDB 数据库层以及几个容易踩坑的边界场景。先说明一点这里说的“root 密码破解”严格讲是“合法重置”。它针对的是你自己有管理权限的机器和账号目的是在密码遗失后恢复访问而不是去攻击别人。文章里所有方法都基于系统官方引导流程和数据库官方支持机制不会教你绕过授权搞入侵。1. 项目概述与适用场景1.1 什么时候需要重置 root 密码“root 密码忘记”这件事几乎每个运维、开发、甚至普通用户都遇到过。典型场景有这么几类第一类是服务器长期没人动交接文档没写清楚 root 密码等到要部署新服务时才发现密码早被换过。第二类是企业内部系统被安全策略强制定期改密管理员改完之后自己忘了记录。第三类是数据库 root 账号因为应用配置不对被锁或者密码被某次误操作覆盖。第四类是刚买的云主机或者新装的 Linux 系统初始密码过期登录直接被拒。不管你属于哪一类核心诉求都一样在不重装系统、不丢数据的前提下重新拿回 root 权限。这也正是本文的价值所在。我见过不少人遇到这种问题第一反应是重装系统结果应用配置全丢代价巨大。实际上大部分场景有干净、可控的重置路径。1.2 重置前必须确认的三件事动手之前先把三个问题搞清楚否则容易把小事搞大。第一确认你要重置的是“哪个 root”。Linux 系统有系统管理员 rootMySQL 数据库有数据库 root安卓设备也有 root 权限。这三者的重置方式和风险完全不一样。标题虽然都叫 root但操作路径完全不同千万别拿数据库的方法去处理系统密码反之亦然。第二确认这台设备的归属权和影响范围。如果是生产服务器、共享数据库重置密码可能影响正在运行的服务、自动化任务、备份脚本。我建议先查阅系统维护窗口或至少跟团队打招呼评估操作风险。不要在一台承载线上业务的机器上直接重启进入单用户模式除非你做好了服务中断的准备。第三确认你的物理或虚拟控制台权限。很多重置方法需要你在系统启动时通过物理终端、虚拟机控制台或者云厂商的 VNC 界面操作。如果你只是 SSH 登录且 SSH 密码也忘了那就走云控制台或找机房远程卡这部分不在本文范围但你要先确认自己能接触到启动界面。提示重置 root 密码在技术上不算难但“什么时候能碰机器”比“怎么敲命令”重要得多。先沟通、再操作这才是成熟运维该做的事。2. Linux 系统 root 密码重置实操2.1 RHEL/CentOS 7 单用户模式重置CentOS 7 是至今很多老系统还在跑的主力版本。它的重启参数和内核引导机制比较经典操作也很稳定。流程如下第一步重启系统在 GRUB 启动菜单出现时快速按上下方向键把光标停在你要启动的内核条目上按e进入编辑模式。第二步找到以linux16或linux开头的那一行行尾通常写着rhgb quiet。把这两个参数删掉然后在行尾追加init/bin/bash注意有的版本需要追加rd.break但在 CentOS 7 上init/bin/bash更直观直接进入一个 bash 环境不经过 systemd 和登录认证。第三步按CtrlX或F10引导启动。这时你会进入一个带#提示符的 shell但根文件系统是只读的需要手动重新挂载为可写mount -o remount,rw /第四步直接修改密码。如果没有 SELinux 干扰直接执行passwd root输入两次新密码即可。如果有 SELinux 强制模式后续可能需要touch /.autorelabel否则重启后可能因为安全上下文问题导致登录异常。第五步执行exec /sbin/init或者直接reboot -f重启用新密码登录。这套方法我用了很多年成功率极高。唯一要注意的是在 GRUB 编辑界面不要误删其他参数尤其是root那个参数删了会导致找不到根分区卡在 dracut 界面。2.2 CentOS 8 及 RHEL 8/9 使用 rd.break 重置CentOS 8 之后的系统改用 GRUB2 加 systemdinit/bin/bash的兼容性不如以前。官方更推荐的临时重置方式是rd.break它会在 systemd 启动早期中断进入一个 initramfs 阶段的 shell。操作步骤启动进入 GRUB 菜单按e编辑。在linux开头的那一行末尾也就是原本rhgb quiet的位置替换成rd.break然后按CtrlX启动。系统会停在类似switch_root:/#的提示符。此时根文件系统同样挂在只读状态而且是在内存文件系统里。你需要在提示符下依次执行mount -o remount,rw /sysroot chroot /sysroot如果提示chroot失败先确认/sysroot确实挂载了有些系统需要先mount /sysroot。进入 chroot 环境后执行passwd root如果需要重新标记 SELinux 上下文执行touch /.autorelabel然后输入exit退出 chroot再输入reboot。系统重启时会自动做 SELinux 重标记耗时视文件数量从几十秒到十几分钟别中途断电。我实测下来rd.break跟init/bin/bash最大的区别是它走的是 initramfs 的早期流程对系统原有环境干扰更小尤其在 RHEL 8/9 上更稳定。但它的坑也很明显有些人chroot /sysroot之后忘了重新挂载/sysroot导致passwd报错。其实只要严格按上面顺序执行基本不会出问题。2.3 Ubuntu/Debian 使用 recovery 模式重置Ubuntu 和 Debian 系的桌面版和服务器版操作略有不同但核心思路一致通过 GRUB 菜单进入 recovery 模式的 root shell。重启后在 GRUB 菜单选择 “Advanced options for Ubuntu”然后选带(recovery mode)的内核条目。系统会弹出 recovery 菜单选择root选项进入 root shell。此时根文件系统通常为只读需要重新挂载mount -o remount,rw /然后执行passwd root如果 Ubuntu 默认禁用了 root 用户很多桌面版安装后 root 没有密码你其实不需要重置而是直接给 root 设置密码sudo passwd root或者保持默认用 sudo 用户执行操作。Ubuntu 还有一个更隐蔽的备选方案在 GRUB 编辑界面把linux行末尾的ro quiet splash改成rw init/bin/bash然后CtrlX进入 bash。这个方式跟 CentOS 7 类似对没有 recovery 菜单的定制 GRUB 环境很管用。需要注意Ubuntu 20.04 之后root 文件系统默认是 overlay 方式entry 如果挂载为只读你要先mount -o remount,rw /否则写的密码不会落盘。2.4 麒麟系统和其他国产 Linux 的类似操作最近几年国内信创环境用得越来越多麒麟Kylin、统信 UOS 等系统也经常有人问怎么重置 root 密码。其实这些系统大多基于 Ubuntu 或 CentOS 的定制版底层引导机制一样。比如中标麒麟基于 Ubuntu用 recovery 模式就好使银河麒麟基于 CentOS则可以用rd.break或init/bin/bash。我在帮朋友处理一台银河麒麟 V10 时用的是 CentOS 8 那套rd.break操作几乎一模一样。唯一的区别是 GRUB 界面的文字可能被定制过菜单项名称不一样但你只要找到类似kernel或linux开头的行就能照猫画虎。这里有个通用判断技巧拿到一台不熟悉的国产系统先看 GRUB 菜单里有没有recovery mode字样有就按 Ubuntu 处理没有就按 CentOS 的rd.break处理。内核参数不同但原理都是绕过正常用户态启动流程进入一个临时的管理员 shell。注意某些国产系统可能在 GRUB 里做了密码保护没有 GRUB 密码的话连编辑菜单都进不去。这种情况只能用主板 BIOS 密码或者厂商提供的维护工具处理不属于常规重置范围。3. MySQL/MariaDB root 密码重置实操3.1 使用 skip-grant-tables 临时绕过认证数据库 root 密码忘记是另一个高频问题。你可能会看到这类报错ERROR 1045 (28000): Access denied for user rootlocalhost (using password: YES)这就是典型的 root 密码不对。重置思路不是去“破解”密码而是让 MySQL 跳过权限表启动然后再重新设置密码。操作步骤第一步停掉数据库服务。不同系统命令不同systemctl stop mysqld # 或 systemctl stop mariadb第二步以跳过授权表的方式启动。使用mysqld_safe或者直接后台启动mysqld_safe --skip-grant-tables 如果mysqld_safe不好使可以手动指定mysqld --skip-grant-tables --skip-networking --skip-networking是关键它禁止远程 TCP 连接避免在无认证状态下被外部访问降低安全风险。第三步用空密码连接数据库mysql -u root此时不需要密码直接进入。然后执行FLUSH PRIVILEGES; ALTER USER rootlocalhost IDENTIFIED BY 你的新密码;如果ALTER USER不生效可以改用SET PASSWORD FOR rootlocalhost PASSWORD(你的新密码);MariaDB 10.4 以上版本还可以用SET PASSWORD PASSWORD(你的新密码);第四步退出并重启数据库服务quit; systemctl stop mysqld systemctl start mysqld这里有几个容易踩的坑FLUSH PRIVILEGES一定要执行否则直接ALTER USER可能会报权限表未初始化重置完成后必须重启数据库让正常认证模式生效mysqld_safe启动时注意日志路径如果端口被占用先 kill 掉残留进程。3.2 通过 init-file 重置密码MySQL 8 支持MySQL 8.0 对skip-grant-tables模式下的一些操作限制更严格有时候直接ALTER USER会报错或者因为密码插件问题导致设置不成功。更稳妥的方式是用--init-file参数让 MySQL 在启动时自动执行一个包含重置语句的 SQL 文件。操作步骤第一步创建一个临时 SQL 文件例如/tmp/mysql-reset.sql内容如下ALTER USER rootlocalhost IDENTIFIED BY 你的新密码;如果 MySQL 版本支持 caching_sha2_password还可以顺便加一句FLUSH PRIVILEGES;第二步停掉 MySQL 服务。第三步使用--init-file启动mysqld_safe --init-file/tmp/mysql-reset.sql 或者直接systemctl set-environment MYSQLD_OPTS--init-file/tmp/mysql-reset.sql systemctl start mysqld启动成功后SQL 文件会被自动执行。你可以用新密码登录验证。第四步验证成功后停库、删除 SQL 文件这是安全习惯防止留有明文密码然后正常启动。这个方法的优势是它走的是 MySQL 官方支持的初始化流程比skip-grant-tables更符合预期尤其适合 MySQL 8 和 Percona Server。缺点是需要一个文件路径且该文件必须能被 mysqld 进程读取。如果启动用户是 mysql注意文件权限要放开到 644 或者改成 mysql 所有。3.3 忘记密码后的数据库数据保护注意事项重置数据库 root 密码不是什么高危操作但有一个原则必须守住不要动 data 目录里的任何文件也不要删除mysql.user等系统表。很多人一急就想着直接改表结果越弄越乱。正确姿势是只通过 SQL 管理账号信息不碰底层文件。原因很简单MySQL 8 把用户信息和认证信息都放在数据字典里非规范操作容易把整个启动流程打断。另外如果你用--skip-grant-tables启动时没加--skip-networking而数据库又恰好暴露在公网上那意味着任何人在无认证状态下都能连上来。这在生产环境是致命的。我见过有人图省事直接mysqld_safe --skip-grant-tables裸奔结果被扫描工具连上数据被拖走。千万不要这么干。还有一个细节修改密码之前建议先查看当前 root 账号的 host 列表SELECT user, host, authentication_string FROM mysql.user WHERE userroot;有时候 root 账号不止一个rootlocalhost、root127.0.0.1、root%是不同条目。如果你只改了localhost但应用用的是%那照样连不上。需要把所有需要的 host 都改一遍。4. 其他常见 root 密码重置场景4.1 应用系统内置 root 账号的重置思路除了 Linux 系统和数据库很多中间件、代码仓库、制品库也有自己的 root 或 admin 账号。比如热词里提到的 Artifactory 重置密码、ES 密码忘记重置、MariaDB root 设置密码等。它们的重置逻辑往往藏在安装目录或配置文件里。以 Artifactory 为例它的默认 admin 密码在第一次启动时生成存在一个临时文件中。如果忘记密码可以通过修改配置文件或者调用内部 API 重置。具体做法通常是在$ARTIFACTORY_HOME/etc下找到相应配置或者使用access-admin工具。不同版本的路径差异很大但核心思路都是绕过认证或者直接改存储里的密码信息。ElasticsearchES的场景要更简单一些。ES 本身没有密码开启安全功能后才有内置用户。如果忘记密码可以在elasticsearch.yml中临时把xpack.security.enabled改为false重启后重置密码再改回来。这个过程不算难但要注意生产环境不要长时间关闭安全认证。这里我想强调一个经验遇到不熟悉的软件系统不要急着在网上搜“破解”而是先看它的官方维护文档里有没有“password recovery”或“reset forgotten password”章节。绝大多数正规软件都提供了官方重置入口只是藏得比较深。学会看官方文档比到处找旁门左道靠谱得多。4.2 免 root 和临时 root 的概念澄清热词里出现“免root”“临时root”“安卓11免root导出存档”这些词其实已经偏离了“重置 root 密码”的初始范围。这里顺带澄清一下避免有人混淆。安卓系统的 root 并不是一个密码而是一种权限状态。所谓的“免 root”通常指利用系统漏洞或虚拟化技术在未解锁 bootloader 的情况下获得部分高级权限。它跟密码重置完全是两码事。如果你只是想在安卓设备上导出某个应用存档用官方备份功能或者厂商提供的工具就行不需要去折腾 root。同样重启进入单用户模式这种操作本质是“临时 root”重置完密码后系统就恢复正常权限模型了。它不是永久绕过安全机制而是在你拥有物理访问权的前提下让系统信任你一次。理解这一点你就能明白为什么这类操作在合规审计里通常被归类为“物理接触下的恢复手段”而不是远程漏洞利用。4.3 密码字典与暴力破解工具的正确认知热词里还有“python 密码破解字典下载”“免 root 卸载 qq 上号器”这类内容。说实话我在实际运维中从来不用这些东西。密码破解字典是给渗透测试用的暴力破解是高风险行为尤其是对公网服务几乎必然触发安全告警甚至违法。把话说得直白一点如果你对自己管理的服务器忘了密码按前面几节的方法十分钟就能重置根本用不着爆破。如果你对别人的服务器尝试爆破那性质就完全不同了。这篇文章讲的是“重置”不是“侵入”。想通过字典跑 root 密码那属于攻击行为我既不支持也不会展开讲。真正专业的做法是用密码管理器管理所有 root 账号密码配合 sudo 日志审计从流程上杜绝忘记密码的窘境。密码字典也许能让你一时爽但出事之后代价远超想象。5. 常见问题与排查技巧实录5.1 重置密码后无法登录的排查重置完密码重启后却依然登录失败这是我遇到最多的状况。原因通常有以下几种按出现频率排序第一密码确实被改了但你登录时键盘布局不对导致输入的密码和设置时有偏差。这在通过 VNC 或 IPMI 控制台操作时尤其常见因为控制台的键盘布局可能默认是 US而你的物理键盘是其他布局。第二SELinux 上下文冲突。如果重置时没有执行touch /.autorelabel系统 password 文件的安全上下文可能被错误标记导致 PAM 模块拒绝读取。解决办法是重启进入单用户模式手动执行touch /.autorelabel后再次重启。第三PAM 模块配置异常。比如/etc/pam.d/system-auth或password-auth被改坏会出现密码明明正确但提示认证失败的情况。这种时候检查/var/log/secure日志能看到具体报错。第四账号被锁定。passwd -l root可以锁定 root 账号如果重置前看到root的密码字段前有!或!!说明账号是锁定的。需要执行passwd -u root解锁。我自己的排查套路是先看/var/log/secure或者/var/log/auth.log找到认证失败的记录。如果实在没思路就重启再进一次单用户模式用chage -l root查看密码有效期再用passwd -S root查看锁定状态。5.2 SELinux 和 AppArmor 引发的坑Linux 强制访问控制模块是重置密码后的主要背锅侠。CentOS/RHEL 系是 SELinuxUbuntu 系是 AppArmor。两者都可能在你重置完密码后制造登录障碍。SELinux 的场景前面已经提过重点再说一遍在rd.break或init/bin/bash环境下文件系统并未按正常策略重启写入的/etc/shadow文件的类型标签可能不正确。解决方式就是touch /.autorelabel这会在下次重启时自动修复所有文件的安全上下文。如果你比较着急可以重启后执行restorecon -v /etc/shadowAppArmor 则更隐蔽。Ubuntu 上有些配置会限制对密码文件的访问但正常重置流程一般不会触发。如果遇到登录被拒绝检查一下 AppArmor 状态sudo aa-status看看有没有 profile 挡住了系统自带的登录程序。遇到问题先临时禁用相关 profile确认问题后再精确定位规则。5.3 如何防止密码再次丢失重置完密码只是治标治本还得靠管理规范。我这几年总结下来最有效的几个防丢手段用密码管理器。无论是 KeePassXC 还是商业密码库都比你记在本地文本里安全。服务器密码全部存到密码管理器里并设置访问主密码。开启 SSH 公钥认证。把 root 密码是不是忘了这件事的依赖度降到最低只要私钥在手SSH 就能登录。公钥认证不依赖 shadow 文件即使密码丢失你也有一条备用通道。当然生产环境建议直接用 sudo 用户加 SSH Keyroot 远程登录关掉。修改密码之后写交接记录。很多企业密码丢失是因为交接文档没更新。我习惯每次改密码后在内部 Wiki 上更新一条记录注明修改时间、修改人、生效范围。启用审计日志。在/etc/sudoers里配置Defaults log_input, log_output记录所有 root 操作。即使哪天密码泄露了也能追溯到是什么时候、从哪个终端执行的。5.4 重置操作速查表最后放一个速查表方便你在现场快速定位使用哪种方法。场景操作系统/环境推荐方法关键参数Linux 系统密码丢失CentOS 7 / RHEL 7单用户模式init/bin/bashLinux 系统密码丢失CentOS 8 / RHEL 8/9rd.breakrd.breakchroot /sysrootLinux 系统密码丢失Ubuntu/Debianrecovery 模式选 root shellLinux 系统密码丢失麒麟/统信基于CentOSrd.break同上Linux 系统密码丢失麒麟/统信基于Ubunturecovery 模式同上MySQL/MariaDB 密码丢失所有版本skip-grant-tables必须加--skip-networkingMySQL 8 密码丢失8.0init-file--init-file/tmp/xxx.sqlES 内置账号Elasticsearch临时关闭 x-packxpack.security.enabled: false这个表只是帮你定位方向每个方法的完整步骤还是要看前面对应的章节。别拿着一张速查表就去生产环境裸奔起码在测试机上练一遍。6. 最后想说的话回到“重置 root 密码”这件事本身我见过太多人在紧急时刻手忙脚乱甚至把服务器搞到只能重装系统。实际上只要掌握 Linux 引导参数和数据库启动参数这两个核心杠杆绝大多数密码问题都能在十分钟内解决。核心逻辑就一句话让系统在认证之前给你一个可交互的 shell然后你再重新定义密码。根据我个人的经验最安全的做法永远是“备而无患”——提前做好密码备份、SSH Key、以及操作演练。这个文章里的每个命令我几乎都在空虚拟机里练过至少三遍才敢用到生产环境。你要是第一次操作建议先用一台测试机走一遍流程把单用户模式和 rd.break 的手感找到再上真实服务器。毕竟密码可以重置但数据没了就是没了。最后再分享一个小技巧重置完密码后顺手执行一下history -c清理当前 shell 的历史记录避免新密码在命令历史里明文保存。如果你用的是passwd命令那本身不会显示密码完全没问题。但如果你用过mysql -p明文密码这种写法记得清理掉相关历史文件。这些微不足道的细节往往比重置命令本身更值得留意。
返回列表