如何在没有提供密码时禁用MySQL root登录?

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(如果你发现这个有用的话,请投票给他答案).

  • 我快要哭了,然后我看到了你的答案.谢谢 (3认同)

Bas*_*asj 7

目前的答案对于 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)

  • 我最终通过将root密码更改为其他内容来解决此问题.现在您回复了,我检查并在我的用户的主文件夹中找到.my.cnf文件,它确实包含root用户/ pass.这一直是个问题.将你的标记作为答案 - 谢谢! (2认同)

Rol*_*DBA 5

看起来您可能有一个或多个匿名用户.

要查看它们运行此查询:

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)

这将显示您如何尝试登录以及mysql如何允许您登录.

运行这两个查询:

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@127.0.0.1
  • 根@ 'hostnameofserver'

如果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)

  • 意识到这个答案有几个upvotes并包含有用的信息 - 但它没有解决我的情况.my.cnf文件中定义的客户端指定密码不受本答复中提供的解决方案的影响.请参阅所选答案以获取更多 (3认同)
  • 请不要在互联网上发布密码的MD5哈希值.你不应该共享任何哈希值,但MD5特别弱(有些人会说破坏),坏人可以确定原始密码. (2认同)