1

最近我开始学习php和sql,因为我对前端有点了解,所以我想加强对后端系统的了解。我买了一个树莓派,并设置了一个简单的 LAMP 服务器,效果很好(ish)。我可以运行 php 表单,这是一个好的开始。

但是,我安装了 MariaDB v10.3.22,但遇到了很多麻烦。安装成功后,我去登录,并期望一个空白密码。那没有用。

mysql -u root -p

我收到错误ERROR 1698 (28000): Access denied for user 'root'@'localhost'因为它是全新安装,所以我尝试了:

mysql_secure_installation

无论如何,我最终发现打字sudo mysql -u root -p可以让我进入,根本不需要密码。事实上,即使运行安全安装sudo也可以让它工作,这意味着我不需要输入正确的密码。在运行 sudo 时,我可以输入任何我想进入 MariaDB shell 和安全脚本的密码,而且它只适用于 root db 用户。为什么是这样?sudo为什么 sudo 可以绕过所有这些,特别是因为我在文档中没有看到任何使用。

我创建了一个具有完全权限的新用户,它工作正常,我不需要 sudo 并且密码确实有效。

对不起,如果这令人困惑,但这是我能解释的最好的,因为我也很困惑。

谢谢,安格斯

4

1 回答 1

1

这可能是由于root用户使用了 Unix Socket 身份验证插件。

正如插件的文档所阐述的那样:

unix_socket 身份验证插件允许用户在通过本地 Unix 套接字文件连接到 MariaDB 时使用操作系统凭据。

unix_socket身份验证插件通过使用套接字选项调用系统getsockopt调用来工作SO_PEERCRED,这允许它检索uid连接到套接字的进程。然后它能够​​获得与该关联的用户名uid。一旦有了用户名,它就会将连接用户认证为具有相同用户名的 MariaDB 帐户。

假设您没有root在 shell 会话中登录,通过运行sudo mysql -u root -p您执行命令 as root,这就是您没有绕过身份验证的原因,它只是按预期使用套接字身份验证。它不需要密码,因为 OS 用户与 MySQL 用户匹配。

您可以通过执行以下操作检查是否root使用 Unix Socket 身份验证:

MariaDB [(none)]> SELECT User, Host, plugin FROM mysql.user;
+------+-----------+-------------+
| User | Host      | plugin      |
+------+-----------+-------------+
| root | localhost | unix_socket |
+------+-----------+-------------+

我还建议您检查解决 MySQL 上相同情况的另一个问题。

于 2020-05-14T05:07:38.633 回答