|
MySQL 8.0 之后,跳过root 用户默认走 auth_socket 插件,密码本地登录直接 sudo mysql 就进去了,验证压根不需要密码。进入很多人不知道这件事,跳过还在那翻 my.cnf 找临时密码。密码如果你用的验证是 5.7 或者更早的版本,装完之后会在日志里打一串临时密码,进入那个才是跳过真正要的东西。但不管哪个版本,密码跳过密码验证这件事,验证本质上就三条路:改配置、进入改认证插件、跳过或者直接改系统表。密码 先说最粗暴的验证——--skip-grant-tables。停掉 MySQL 服务,在启动参数里加上这个选项,服务起来之后任何用户、任何密码都能登,权限校验整个被绕过。操作大概是这样: sudo systemctl stop mysql sudo mysqld_safe --skip-grant-tables & mysql -u root 进去之后你干的第一件事应该是 FLUSH PRIVILEGES;,否则改密码的语句会被拒绝。然后 ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';。完事重启服务,恢复正常模式。这个方法我用过不下十次,尤其是帮人救那种忘了密码的老服务器。但有个坑:--skip-grant-tables 模式下,远程连接也是不校验的,如果服务器暴露在公网,这几分钟就是裸奔。所以操作完立刻重启,别拖。 另一条路是改认证插件。MySQL 8 默认给 root 配了 caching_sha2_password 或者 auth_socket。你可以在 /etc/mysql/mysql.conf.d/mysqld.cnf 里加一行 skip-grant-tables 然后重启,但更优雅的做法是直接改插件: ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密码'; 这行命令在你能正常登录的时候才有用。如果已经进不去了,那就得回到上一条路。我见过有人把 mysql_native_password 当成万能钥匙,其实它只是换了一种密码哈希方式,安全性比 caching_sha2_password 低,但兼容性更好。老版本的 Navicat 连不上 MySQL 8,多半就是插件不匹配。 还有一种情况:你根本不需要密码,因为用的是 auth_socket。Ubuntu 上 apt install mysql-server 之后,root 默认就是这个插件。它检查的是操作系统用户是不是 root,是的话直接放行。所以你 sudo mysql 能进,mysql -u root -p 反而进不去。这不是 bug,是设计。想改成密码登录,执行: ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY '新密码'; 然后 FLUSH PRIVILEGES;。注意,改完之后 sudo mysql 就不好使了,得用密码。 最后提一个真实案例。去年帮一个朋友处理一台被入侵的服务器,MySQL 的 user 表里多了一个 'test'@'%' 的空密码账户。攻击者就是通过这个账户拿到的数据库权限。所以跳过密码验证这件事,自己用是救急,被别人用就是灾难。检查一下 SELECT user, host, plugin FROM mysql.user;,看看有没有不该存在的账户和空密码。有的话,DROP USER 掉,别犹豫。 操作完记得 FLUSH PRIVILEGES;,这个命令我写了三遍,因为它真的容易被忘。忘了的话,你改的东西只在当前会话生效,重启就还原。别问我是怎么知道的。 |