Linux中不知道密码登录Mysql
Linux中不知道Mysql的root账户的登录密码该如何登录Mysql?
下面提供两种方式:一是使用skip-grant-tables跳过密码验证,二是修改存储在磁盘上的root账户的登录密码的Hash值。
测试环境:Ubuntu14.04 + Mysql5.5.57。
skip-grant-tables
顾名思义,“skip-grant-tables”是跳过授权表,不用密码便可以root身份登录,具有完全的root用户权限,可以修改root密码。
在网上找到一些文章,说停止Mysql服务后以“–skip-grant-tables”为参数启动Mysql便可以免密码登录,但在我的测试中,这种方式是无效的。有效的方法是在Mysql的配置文件中添加“skip-grant-tables”,再重启Mysql,之后便可以免密码登录。
在Linux中,Mysql的配置文件是my.cnf,它位于/etc/my.cnf或是/etc/mysql/my.cnf等,具体在哪,取决于Linux发行版本和Mysql安装方式。打开my.cnf,搜索“[mysqld]”,在这行下面添加一行,内容为:“skip-grant-tables”,如下图所示:
添加完成后重启Mysql服务,在我的测试环境中,用如下命令重启Mysql服务:
sudo /etc/init.d/mysql restart
此时再登录Mysql,便不需要密码了,如下图所示:
修改root用户密码Hash值
Linux中,Mysql用户密码以Hash值的形式存储在文件user.MYD中,可用如下命令找到该文件位置:
sudo find / -name user.MYD
查看该文件同样需要sudo权限,用cat命令查看该文件内容如下图所示:
可以看到该文件中有许多长得很像Hash值的东西。我们自己计算一个已知的字符串的Hash值,替换掉该文件中的Hash值,便可以达到修改root密码的目的。
这里有一个问题,Mysql在保存用户密码时使用了什么Hash算法?简单谷歌一下便知道,使用的算法如下:
mysql> select concat('*',sha1(unhex(sha1('toor'))));
+-------------------------------------------+
| concat('*',sha1(unhex(sha1('toor')))) |
+-------------------------------------------+
| *9cfbbc772f3f6c106020035386da5bbbf1249a11 |
+-------------------------------------------+
1 row in set (0.00 sec)
基本上是做了两次sha1,再在所得字符串前加上“*”,只不过在两次sha1中间还有一个unhex函数,
该函数的作用是将每对十六进制数字转化为一个字符,如unhex(‘616263’)的输出为“abc”。
此外,Mysql有内置函数password,可直接计算密码的Hash值:
mysql> select password('toor');
+-------------------------------------------+
| password('toor') |
+-------------------------------------------+
| *9CFBBC772F3F6C106020035386DA5BBBF1249A11 |
+-------------------------------------------+
1 row in set (0.00 sec)
好了,现在用“9cfbbc…1”替换user.MYD文件中的“6B8252…B”,保存后尝试用密码“toor”登录Mysql的root用户,登录失败!
推测Mysql对该文件有所缓存,故重启Mysql,再次尝试用“toor”登录Mysql的root用户,这次成功登录。