☰
root密码忘记怎么办?系统、数据库与设备重置全攻略
2026/10/8 2:44:46 网站建设 项目流程

1. 到底什么是“重置root密码”

先说结论:root密码忘了,是运维生涯里最常遇到的“心跳骤停”场景之一。无论是线上Linux服务器、云主机,还是本地的MariaDB数据库,甚至家里的电视盒子,一个“root密码失效”就能让你从从容容的下午变成焦头烂额的加班夜。

这里要先厘清一个概念。标题里的“重置(破解)root密码”,在不同环境下的含义完全不一样:

  • Linux系统root密码:指的是操作系统的超级管理员账户密码,忘了它,你就没法登录服务器执行管理命令。
  • 数据库root密码:指的是MySQL、MariaDB这类数据库软件的root账号密码,忘了它,业务代码连不上库,网站直接白屏。
  • 安卓设备的root权限:这里更多是“获取root授权”而不是“重置密码”,比如绕过系统限制获得超级用户权限。
  • 企业软件的后台root/管理员密码:像Artifactory这类企业级中间件,也有自己的admin密码,忘了也有对应的重置套路。

但不管哪种场景,核心思路是共通的:绕开正常的身份认证流程,直接修改或者清理存有密码信息的认证数据。这个思路一旦想明白了,后面所有操作都是顺着这个主线展开的。

这篇文章我会把这个思路拆细,覆盖Linux系统、MySQL/MariaDB数据库、安卓设备、以及几个容易踩坑的特殊中间件场景,把每一种情况的原理和实操步骤都过一遍。方法是通用的,重点是让你理解“为什么这么做”,而不是单纯背命令。

在我实际处理过的故障里,大概有七成是操作系统层面密码丢失,两成是数据库密码过期或记错,剩下一成是各种奇奇怪怪的设备——比如电视盒子刷机、企业应用后台锁定。这篇文章就是按这个比例来分配篇幅的。

2. Linux系统root密码重置:三种核心方案详解

Linux系统密码忘记,是刚需场景。网上方案一大堆,但很多教程只给命令不讲原理,导致有人跟着操作不但没重置成功,反而把系统搞坏了。这里把主流的三种方案完整拆解一遍。

2.1 方案一:rd.break强制重置(RHEL/CentOS系首选)

这个方案适用于RHEL、CentOS、Rocky、AlmaLinux等红帽系发行版,也是我在生产环境里用得最多的方式。

原理其实很直白:系统在启动过程中,GRUB引导菜单先加载内核,而rd.break这个内核参数会让内核在切换到真正的系统根目录之前,先停在一个临时的initramfs环境里。在这个环境里,真正的系统根目录被挂载在/sysroot下,但默认是只读的。你能拿到root权限,但动不了真正的系统文件——所以要先重新挂载成可读写。

操作步骤如下:

  1. 重启服务器,在GRUB引导菜单出现时,选中要启动的内核,按e键进入编辑模式。
  2. 找到以linux开头的那一行(通常是linux或linux16),在行尾追加一个参数:rd.break。
  3. 按Ctrl+x或F10启动系统,此时系统会进入一个带switch_root:/#提示符的紧急环境。
  4. 依次执行:
# 重新以读写方式挂载真正的系统根目录 mount -o remount,rw /sysroot # 切换真正的根目录环境 chroot /sysroot
  1. 此时你已经处于原本的系统环境里,直接修改密码:
# 修改root密码 passwd root # 如果SELinux是启用的,必须创建这个标记文件 # 这样系统重启后会自动重新标记所有文件的安全上下文 touch /.autorelabel
  1. 退出并重启:
exit reboot

这里有个很重要的细节:为什么要touch /.autorelabel?因为SELinux环境下,你通过chroot方式修改的文件安全上下文可能不正确,如果不重新打标签,重启后系统可能连登录都进不去,甚至某些服务无法启动。这一步会延长启动时间,但能避免一个巨大的坑。

2.2 方案二:单用户模式(systemd系通用)

这个方案在Ubuntu、Debian、以及CentOS 7以上版本都适用。原理同样是在GRUB引导时指定内核参数,让系统直接进入单用户模式(救援模式)。单用户模式下只有root一个用户,不需要输入密码,也没有其他服务的干扰。

操作步骤:

  1. 重启进入GRUB菜单,按e编辑。注意:Ubuntu和CentOS的GRUB菜单格式略有差异,但思路相同。
  2. 找到linux开头那一行,把行尾的rhgb quiet(CentOS系)或者ro quiet splash(Ubuntu系)删掉,替换成:
systemd.unit=rescue.target

如果这条不管用,还可以试single或init=/bin/bash,但rescue.target在systemd系里是最规范的写法。

  1. 按Ctrl+x启动,系统会进入一个root shell,不需要密码。
  2. 直接执行:
passwd root
  1. 重启即可:exec /sbin/init或者reboot -f。

这个方法比rd.break简单,但有个前提:有些系统在进入救援模式时还是会要求输入root密码(如果之前设置了SELinux策略或PAM认证),那就得换方案一或方案三了。另外,如果系统里启用了全盘加密(LUKS),所有方案都需要先有加密盘密码才能在启动过程中解密成功,这一点容易被忽略。

2.3 方案三:init=/bin/bash方式

这也是一个历史悠久的方案,原理是让内核直接启动一个bash shell,而不是启动完整的init系统。如果你要在不依赖systemd的情况下快速进入系统,这个方案是最直接的。

步骤:

  1. GRUB编辑,在linux行末尾追加:
init=/bin/bash
  1. 启动后你会直接得到一个bash提示符。
  2. 此时根目录是只读的,需要重新挂载:
mount -o remount,rw /
  1. 修改密码:
passwd root
  1. 如果命令行提示Authentication token manipulation error,说明/etc/passwd或/etc/shadow不可写,确认上一步挂载是否生效。

  2. 重启:如果此时直接reboot命令可能不生效,因为init进程被替换掉了,可以用:

exec /sbin/init

或者直接echo b > /proc/sysrq-trigger强制重启(仅限虚拟机或本地物理机,不建议在云主机上乱来)。

这个方法有个弊端:启动过程特别“裸”,没有加载各种服务,如果系统根分区是LVM或复杂的RAID,可能无法正确识别,根本进不去shell。所以它更适合系统结构简单的场景。

2.4 方案四:Live CD / 启动盘方式

当上面三种方法都失效时(比如GRUB损坏、密码策略强制、SELinux问题),最后一个兜底方案是用系统安装U盘或Live CD启动,然后挂载磁盘修改密码文件。

原理很简单:用外部的系统启动后,把原来系统所在的分区挂载到某个目录下,然后用chroot进入这个挂载点,执行passwd root。

以CentOS安装盘为例:

  1. 用安装U盘启动,选择“Troubleshooting”,再选“Rescue a CentOS system”。
  2. 按提示选择语言、键盘,系统会尝试自动发现并挂载根分区到/mnt/sysimage。
  3. 选择“Read-Only”或“Read-Write”挂载模式——这里务必选“Read-Write”。
  4. 进入shell后:
chroot /mnt/sysimage passwd root
  1. 如果忘了系统的根分区在哪个设备上,可以在shell里执行blkid查看,也可以fdisk -l列出所有分区。

这个方法最大的优点是不依赖原系统内核,所以即使内核坏了、GRUB没了、甚至grub.cfg配置混乱,都还有救。缺点是必须有可用的启动介质,云服务器不一定支持挂载ISO,所以云环境里更多还是用方案一和方案二。

2.5 实操对比:不同场景下的选型建议

我来整理一张表,方便你快速决策:

适用系统操作难度是否需要物理/远程控制台典型场景
RHEL/CentOS/Rocky等红帽系中等是生产服务器常用,最可靠,SELinux兼容最好
Ubuntu/Debian等systemd系低是最快速,适合本地VM和物理机
系统结构简单、无LVM低是应急备用方案
所有系统中高需要U盘/ISO系统内核损坏、GRUB丢失等严重场景

实际生产环境里,我个人的选择优先级是:云主机用方案一,本地VM用方案二,老服务器或特殊系统用方案四。方案三更多是原理了解,很少真的在生产中用。

3. 数据库root密码重置:MySQL、MariaDB实战

如果说系统密码丢失让你进不了门,那数据库密码丢失就是业务直接趴在门口。系统密码还能慢慢折腾,数据库密码动不动就是线上事故。这里把MySQL和MariaDB(MariaDB是MySQL的分支,很多参数通用)的密码重置方法讲透。

3.1 跳过权限表法

这是最经典、各家教程都会写的方法。原理是让MySQL以--skip-grant-tables参数启动,这样MySQL在启动时根本不去加载mysql库里的授权表,所有认证都跳过。

针对不同版本的操作:

MySQL 5.7及以上、MariaDB 10.x:

  1. 先停掉数据库服务:
systemctl stop mysqld # 或者 systemctl stop mariadb
  1. 以跳过权限表的方式启动(注意这个方式会启动一个临时进程,不用系统服务方式):
mysqld_safe --skip-grant-tables --skip-networking &
# 等几秒,确认启动成功 tail -f /var/log/mysqld.log

这里特别说明一下:--skip-networking是我强烈建议加上的参数。因为--skip-grant-tables意味着所有客户端都可以不用密码直接连进来,如果监听在公网或非本机地址上,危险程度等同于裸奔。--skip-networking让MySQL只监听本机socket连接,强行物理隔离了外部网络访问。

  1. 另开一个终端,以root身份直接免密进入:
mysql -uroot
  1. 进入后先刷新权限表,让grant tables生效:
FLUSH PRIVILEGES;

这一步非常关键。如果不执行,后面的ALTER USER或SET PASSWORD会报错,提示Table 'mysql.user' is readonly——因为skip-grant-tables模式下授权表是只读的。

  1. 修改密码:

MySQL 5.7的mysql.user表里,密码字段是authentication_string。可以直接UPDATE:

UPDATE mysql.user SET authentication_string=PASSWORD('你的新密码') WHERE User='root'; FLUSH PRIVILEGES;

MySQL 8.0里PASSWORD()函数被移除了,不允许用这种方式。得用ALTER USER:

ALTER USER 'root'@'localhost' IDENTIFIED BY '你的新密码';

MariaDB 10.x其实也可以用UPDATE,但为了统一规范,建议直接写SET PASSWORD或ALTER USER。

  1. 退出并重启服务:
exit mysqladmin shutdown systemctl start mysqld

3.2 init-file方式

这个方法比较冷门,但不用改启动参数,也不怕“权限表只读”的坑。原理是:MySQL在初始化启动时,如果配置文件里指定了init-file,会先执行这个文件里的SQL语句。

步骤:

  1. 在任意位置创建一个临时SQL文件,比如/root/mysql-init.sql,内容写:
ALTER USER 'root'@'localhost' IDENTIFIED BY '你的新密码';

注意:MySQL 8.0用ALTER USER,MySQL 5.7和MariaDB也可以用SET PASSWORD FOR 'root'@'localhost' = PASSWORD('你的新密码');。

  1. 修改数据库配置文件(/etc/my.cnf或/etc/mysql/my.cnf),在[mysqld]下添加:
init-file=/root/mysql-init.sql
  1. 重启MySQL:
systemctl restart mysqld

启动时它会自动执行文件里的SQL,把密码改掉。

  1. 确认修改成功后,立即删除这个SQL文件和配置项。这个文件里就是纯文本密码,留着等于把数据库大门钥匙贴在门口。

这个方法有一个额外的好处:如果root密码没忘,但某些账号权限配置乱了,写几条GRANT语句放到init文件里,重启后自动搞定,比手动一条条执行省事。

3.3 Error 1045 (28000):access denied到底怎么排查

热词里出现了error 1045 (28000): access denied for user 'root'@'localhost' (using password: YES),这是数据库连接报错里最经典的一条。先说结论:这条报错只说明一件事——认证没通过。可能是密码错、可能是host不匹配、也可能是该账号本身就不存在。

排查思路:

  1. 先试试socket登录是否正常。
mysql -uroot -p密码

如果socket都进不去,说明密码就是错的,走上面的重置流程。

  1. 如果socket能登录,但TCP连接报1045:
SELECT user, host, authentication_string FROM mysql.user;

重点看host字段。mysql.user表里,'root'@'localhost'和'root'@'%'是两个完全独立的账号。你改密码时可能只改了localhost,但应用用的是TCP从别的机器连的,匹配的是'root'@'%'这个记录,密码当然对不上。

  1. 还有一种常见情况:skip-grant-tables忘记关掉。如果my.cnf里残留了这个参数,MySQL仍然在跑,但所有客户端免密能登录,此时不会报1045,而是随便输什么密码都连不上——因为认证被跳过了,逻辑上是“不用密码,但你要输密码也忽略”。这种时候去看一下配置文件,把参数删掉重启就行。

3.4 MySQL 8.0和MariaDB的密码字段差异

这里我要特别提醒一个坑:不同版本的mysql.user表结构不一样。老的教程教你去UPDATEmysql.user表的authentication_string字段(5.6之前叫password),但到了MySQL 8.0,直接UPDATE这张表是无效的——8.0使用caching_sha2_password插件,密码哈希算法变了,手动UPDATE出来的是一个无效哈希,连登录会被拒绝。

稳妥做法:

  • MySQL 8.0及以上、MariaDB 10.4及以上:直接用ALTER USER命令,不要动mysql.user表。
  • MySQL 5.7及以下、MariaDB 10.3及以下:可以使用UPDATE mysql.user SET authentication_string=PASSWORD(...),但也要小心版本细节。
  • 通用做法:先ALTER USER ... IDENTIFIED BY,不行再考虑UPDATE。别拿生产库试版本差异。

4. 安卓设备root密码与root权限:概念和重置思路

热词里关于安卓的占了近一半:安卓11免root导出存档、免root虚拟相机、免root卸载qq上号器、电视盒子root、刷root固件。可见大家对这个话题的需求量很大。但这里必须理清一个概念:安卓系统的root和Linux的root不一样。

4.1 安卓root的真实形态

安卓底层是Linux内核,所以理论上存在一个root用户,但这个root用户默认是被禁用的。安卓的“root”通常指的是拿到Superuser权限,也就是通过某种方式让当前的应用进程能以root身份执行命令,或者往系统分区写入数据。

所以热词里“安卓11免root导出存档”、“免root虚拟相机”这类需求的本质是:在不获得完整root权限的情况下,通过特定漏洞或调试接口做某个特定操作。免root备份存档一般用的是Android的run-as调试模式或备份协议,不是真正的root。

获取安卓root权限也不是“改密码”,而是“替换系统组件”:

  • 刷入Magisk:目前最主流的方式。原理是修改boot镜像,在启动时挂载一个magisk的模块系统,通过su授权管理应用(Magisk Manager)来控制哪些应用有root权限。
  • 使用SuperSU类工具:老一代的root方案,用su二进制文件替换系统里的/system/xbin/su,配合SuperSU APK管理授权。
  • 临时root(temp root):利用系统漏洞临时获取root shell,重启后失效。热词里op临时root就是这个套路。

4.2 电视盒子、旧手机这类设备的“root固件”

热词里出现了b860av2.1-a root固件、rom直链包root、电视盒子root。这类设备的特点是:厂商锁了bootloader,普通方式进不了fastboot刷机,只能刷整包ROM或者替换recovevery再root。

基本思路是:

  1. 解锁Bootloader(有的盒子不让解,只能走固件包替换方式)。
  2. 刷入第三方的Recovery(比如TWRP)。
  3. 用Recovery刷入Magisk补丁过的boot镜像或卡刷包,或者直接刷带root的第三方固件(rom直链包)。
  4. 重启后安装Magisk Manager,完成授权。

如果设备已经root了,但要“重置root密码”——准确说重置Magisk的授权记录和超级用户密码,做法是:打开Magisk Manager,在“设置”里选择“清除超级用户授权记录”;或者卸载Magisk后重新刷入一次。

4.3 免root方案与root方案的选择逻辑

说句实在话:以现在安卓生态的情况,非必要不root。如果你只是想要备份存档、虚拟相机、卸载预装应用,能走免root方案就尽量免root。原因在于:

  • 现在很多银行、支付、游戏都有root检测,一旦检测到root直接拒绝运行或闪退。
  • 系统OTA更新会受阻碍,Magisk有时候能保留root升级,但万一新系统改了分区结构就翻车。
  • root之后中毒或者被恶意应用调用su提权,手机就是别人的了。

免root备份存档的办法:使用ADB的backup命令(老版本Android)、或使用厂商自带的备份工具(小米、华为云备份)、或用Shizuku+AppOps这类工具走ADB授权绕开root需求。虚拟相机的免root方案则是用虚拟摄像头驱动级别的应用,比如用一台老手机做远程摄像头源,而不是直接魔改相机应用。

5. 特殊场景:Artifactory等企业软件的管理员密码重置

热词里artifactory重置密码这个点也值得展开。Artifactory是JFrog出品的制品库管理工具,公司里存Docker镜像、npm包、Maven构件都靠它。如果管理员密码忘了,还真不是改个数据库就能搞定的。

Artifactory的root密码管理分两类情况:

6.x及之前版本:管理员信息存在access库的users表里,密码是加密哈希。可以通过官方提供的access-cli工具重置:

# 进入Artifactory的安装目录,使用自带的access-cli cd $ARTIFACTORY_HOME/app/bin ./access-cli -u admin -p 旧密码 user unlock admin ./access-cli -u admin -p 新密码 user change-password

7.x版本及以上:引入了bootstrap机制,首次启动时会在$ARTIFACTORY_HOME/etc下生成一个bootstrap.password文件,里面是初始管理员密码。如果忘了,删除这个文件并重启Artifactory,系统会重新创建一个新的初始密码文件,拿新文件里的密码登录后马上设置自定义密码。

这个方法同样适用于很多Java系中间件(如Nexus、SonarQube),它们的密码恢复逻辑都是“删除引导文件重启生成新密钥”。

6. 重置密码后的善后与避坑清单

重置密码只是开始,善后工作才是真正体现运维水平的地方。根据我的经验,密码重置之后最容易出问题的有这么几件事:

6.1 修改密码后系统服务起不来

在rd.break或init=/bin/bash方式重置密码后,如果SELinux是enforcing模式,没有执行touch /.autorelabel,重启后可能直接卡在Failed to load SELinux policy或者所有服务都起不来。这种情况可以再次进入rd.break环境补上标记文件,或者启动时加selinux=0参数先绕过,再重新标记。

6.2 数据库重置后应用连不上

改完数据库root密码之后,一定要检查一下应用里配置的连接密码是否同步更新了。常见的坑是:只改了'root'@'localhost'的密码,但应用用的账号是'root'@'%',或者干脆单独建了一个'app'@'%'账号。这种时候不要无脑改root,在mysql.user表里看清楚应用实际匹配的host和账号。

6.3 建议的密码管理规范

每次重置完密码,我强烈建议做这几件事:

  • 把新密码放进团队密码管理工具(如Bitwarden、Keepass),不要只在微信里发来发去。
  • 数据库和系统密码不要设成一样的,也别用生日、公司名这种一眼就被社工库撞库的组合。
  • 检查系统的认证日志,比如/var/log/secure(CentOS系)或/var/log/auth.log(Ubuntu系),看有没有异常登录尝试,确认这次密码丢失是单纯遗忘还是被外部攻击导致的可疑阻断。
  • 云服务器如果开了安全组,把数据库端口限制到最小网段,别让MySQL的3306暴露在公网上,这比密码再复杂都重要。

6.4 一个小技巧:密码重置后的“验证三步走”

我每回重置完密码,都会按固定顺序验证,避免“好像改了但又没改成功”的悬空状态:

  1. 先本地验证:直接mysql -uroot -p新密码 -h127.0.0.1(数据库),或su - root后用whoami确认身份(系统)。
  2. 再远程验证:从应用服务器上ping通数据库端口,然后用实际业务账号连一次。
  3. 最后清理痕迹:删掉历史记录里出现密码的临时文件、SQL初始化文件、shell history里的命令记录(history -c),并重新登录一次确认认证流程走通。

这样做的好处是:重置密码不再是一个“盲人摸象”的过程,每一步都有确凿的验证结果,而不是等第二天业务报警了才知道密码根本没改成功。

7. 我踩过的坑和沉淀下来的经验

写到最后,分享几个我在实际重置root密码过程中踩过的坑,以及沉淀下来的经验。

第一个坑是云服务器上使用rd.break方案时,如果服务器的控制台没有及时响应键盘输入,GRUB编辑模式很容易错过。这时候最稳妥的做法是在重启前就打开云厂商的VNC控制台或网页版终端,确保光标能定位到GRUB菜单。

第二个坑是MySQL用mysqld_safe --skip-grant-tables启动后,服务进程是前台运行的,如果直接关闭SSH窗口,服务可能被SIGHUP信号杀掉。正确做法是先用nohup或systemd-run方式启动,或者修改完密码后立刻按正规流程mysqladmin shutdown收尾。

第三个坑是关于修改密码后的“时间同步”问题。不是时钟,而是会话级缓存:如果数据库开启了skip-name-resolve或缓存了连接信息,改完密码后已有连接不会立刻断开,需要重启MySQL或者KILL掉旧连接才会体现。所以改完密码记得SHOW PROCESSLIST看看有没有老连接挂着。

第四个经验:很多密码重置问题其实是因为“初始默认密码被系统强制过期”引起的。Linux的/etc/shadow里密码字段有最大修改天数参数,如果设为0天,每次登录都强制改密;MySQL也有default_password_lifetime参数。遇到这类场景,重置密码之后要顺手检查一下密码策略,把合理值设为90天或180天,避免下次又被锁在门外。

我在实际处理中总结出的核心心法是:重置密码不是目的,恢复可用性和确定性才是目的。一次成功的密码重置,应该让你既恢复了访问能力,也梳理清楚了系统的认证体系、账号权限、连接关系,顺手还能把管理规范理一遍。这样一次故障下来,收获的不只是一条新密码,还有一套更健康的系统。这套思路用熟了,任何环境下的root密码问题都不再是难题。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询