a c*_*der 12 mysql passwords login root
MySQL安装在我的笔记本电脑上,它工作正常,但我可以在不提供root密码的情况下登录.我也可以通过提供root密码登录.如果提供的密码不匹配,则拒绝访问.我最初安装MySQL时,root密码已更改为我自己选择的密码.我刚刚注意到今天没有密码登录.
因此,我需要在未提供密码时停止访问root帐户.我到目前为止尝试的是重置root密码:
mysqladmin -u root password TopSecretPassword
然后我登录到控制台并发出:
mysql> flush privileges; exit;
我仍然可以使用以下命令登录MySQL:
%> mysql -u {enter}
我该如何阻止这种行为?
额外细节:
%> mysql -u {enter}
mysql>SELECT USER(), CURRENT_USER();
> root@localhost, root@localhost
mysql>SELECT COUNT(*) FROM mysql.users WHERE user='root' AND password='';
> COUNT(*)
> 0
mysql>SELECT COUNT(*) FROM mysql.users WHERE user='';
> COUNT(*)
> 0
mysql>SELECT COUNT(*) FROM mysql.users WHERE user='root';
> COUNT(*)
> 1
%> vi /etc/my.cnf
/skip-grant-tables
> E486: Pattern not found: skip-grant-tables
Jer*_*vis 12
在较新版本的MySQL/MariaDB(例如Debian Stretch等)中遇到此行为的用户应该知道,在mysql.user表中,有一个名为"plugin"的列.如果启用了'unix_socket'插件,则root将能够通过命令行登录而无需密码.其他登录机制将被禁用.
要检查是否是这种情况:
SELECT host, user, password, plugin FROM mysql.user;
Run Code Online (Sandbox Code Playgroud)
应该返回这样的东西(启用unix_socket):
+-----------+------+--------------------------+-------------+
| host | user | password | plugin |
+-----------+------+--------------------------+-------------+
| localhost | root | <redacted_password_hash> | unix_socket |
+-----------+------+--------------------------+-------------+
Run Code Online (Sandbox Code Playgroud)
要禁用它并要求root使用密码:
UPDATE mysql.user SET plugin = '' WHERE user = 'root' AND host = 'localhost';
FLUSH PRIVILEGES;
Run Code Online (Sandbox Code Playgroud)
然后重启:
service mysql restart
Run Code Online (Sandbox Code Playgroud)
问题解决了!:
root@lamp ~# mysql
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
Run Code Online (Sandbox Code Playgroud)
资料来源:https: //stackoverflow.com/a/44301734/3363571非常感谢@SakuraKinomoto(如果你发现这个有用的话,请投票给他答案).
目前的答案对于 MySQL 8 来说不再适用。确实:
在 MySQL 8.0 中,
caching_sha2_password是默认的身份验证插件mysql_native_password,而不是 MySQL 5.7 中的默认身份验证插件。
所以解决方案是运行mysql,然后
ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'yourpasswd'; EXIT;
Run Code Online (Sandbox Code Playgroud)
然后mysql -uroot -p尝试一下是否有效。(我不记得是否service mysql restart有必要)。
如果您已经应用了这个实际问题的主要答案中的技术,以下是如何将其恢复到 MySQL 8:
UPDATE mysql.user SET plugin = 'caching_sha2_password' WHERE user = 'root' AND host = 'localhost';
FLUSH PRIVILEGES;
Run Code Online (Sandbox Code Playgroud)
小智 6
我知道这个问题已经有几个月了,但我遇到了同样的问题.
在我的情况下,这是由于位于〜/ .my.cnf的用户特定配置文件的存在,其中包含用户和密码.在我的例子中,cPanel创建了这个配置文件.
[client]
pass="ROOT_PASSWORD_WAS_HERE!"
user=root
Run Code Online (Sandbox Code Playgroud)
特定于用户的配置文件是MySQl的一项功能,所有读取的配置文件的位置在文档中有详细说明:http://dev.mysql.com/doc/refman/5.1/en/option-files.html.
如果您在*nix dist上运行mysql,请运行以下命令以查看您是否具有特定于用户的配置文件:
cat ~/.my.cnf
Run Code Online (Sandbox Code Playgroud)
看起来您可能有一个或多个匿名用户.
要查看它们运行此查询:
SELECT user,host,password FROM mysql.user WHERE user='';
Run Code Online (Sandbox Code Playgroud)
要查看您已经过身份验证,请运行以下命令:
SELECT USER(),CURRENT_USER();
Run Code Online (Sandbox Code Playgroud)
运行这两个查询:
DELETE FROM mysql.user WHERE user='';
FLUSH PRIVILEGES;
Run Code Online (Sandbox Code Playgroud)
应该这样做!!!
CAVEAT#1
如果这不起作用,请检查/etc/my.cnf以获取此选项:
skip-grant-tables
Run Code Online (Sandbox Code Playgroud)
如果是在my.cnf中,请将其删除并重启mysql.
CAVEAT#2
需要注意的是有多个root用户.请运行这个:
SELECT user,host,password FROM mysql.user WHERE user='root';
Run Code Online (Sandbox Code Playgroud)
如果您将root定义为拥有密码并仍以root身份进入,则表示拥有多个root用户.mysql.user中可能有这些条目
如果root用户没有密码,mysql可能允许来自任何root用户的身份验证.这应该在您运行时显现,SELECT USER(),CURRENT_USER();因为每个函数的输出将显示为不同.
如果一个root用户具有MD5密码而其他所有root用户都没有,则可以将该MD5密码传播给其他root用户,如下所示:
UPDATE mysql.user
SET password =
(
SELECT password FROM mysql.user
WHERE user='root' AND password <> ''
)
WHERE user='root' AND password = '';
FLUSH PRIVILEGES;
Run Code Online (Sandbox Code Playgroud)