使用 unix_socket 登录 MySQL 帐户
Log in into MySQL account with unix_socket
我创建了一个从机器 A 到机器 B 的转发器(通过 SSH)。机器 B 有一个 MySQL 实例 运行,root 帐户使用 unix_socket 身份验证:
+----------+-----------+-------------+
| User | Host | plugin |
+----------+-----------+-------------+
| root | localhost | unix_socket |
+----------+-----------+-------------+
无论我使用什么密码(空白、Linux root 密码等),我都无法从机器 A 以 root 身份登录:
machineA:~$ mysql -h 127.0.0.1 -P 1111 -u root -p
Enter password:
ERROR 1698 (28000): Access denied for user 'root'@'localhost'
machineA:~$ mysql -h 127.0.0.1 -P 1111 -u root
ERROR 1698 (28000): Access denied for user 'root'@'localhost'
如果我尝试使用不是 root 帐户的帐户从计算机 B 登录 mysql,也会发生同样的情况。
如何登录 MySQL?
要连接到远程 MySQL 服务器,无论是直接连接还是通过 SSH 隧道,您都不能使用 unix_socket
身份验证插件,它需要本地访问 unix 套接字文件数据库服务器操作系统。
unix_socket
插件是使用一种特殊类型的文件(unix 套接字)实现的,它是 *nix 系统中 inter-process 通信 (IPC) 的一种形式。它允许您的 mysql CLI 客户端与数据库对话,并且需要本地访问套接字文件(即:/tmp/mysql.sock
)。当您连接到套接字时,unix_socket
插件 (server-side) 将获取连接到套接字的用户的 uid(即:youruser),并且无需密码即可自动对您进行身份验证。
可能的解决方案:
如果您使用 non-root 用户连接到机器 B,您需要创建一个与您的 non-root 操作系统用户帐户名同名的数据库用户。
GRANT ALL PRIVILEGES ON *.* TO 'youruser'@'localhost' IDENTIFIED VIA unix_socket;
现在您可以使用您的用户帐户和 mysql CLI 客户端连接到 mysql,只需 运行ning:
youruser:~$ mysql
如果您想使用 root 用户连接到数据库,那么您需要访问 root 帐户或与您的用户关联的 sudo 策略以 运行 mysql 客户端。
youruser:~$ sudo mysql
您显然可以启用对您的数据库根帐户的常规经过身份验证的网络访问。这可能会导致安全问题,因此最好将其限制为本地主机:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'127.0.0.1' IDENTIFIED BY 'xxx' WITH GRANT OPTION;
现在您可以从任何本地操作系统帐户登录,如果您可以验证您的登录:
youruser:~$ mysql -u root -p
我创建了一个从机器 A 到机器 B 的转发器(通过 SSH)。机器 B 有一个 MySQL 实例 运行,root 帐户使用 unix_socket 身份验证:
+----------+-----------+-------------+
| User | Host | plugin |
+----------+-----------+-------------+
| root | localhost | unix_socket |
+----------+-----------+-------------+
无论我使用什么密码(空白、Linux root 密码等),我都无法从机器 A 以 root 身份登录:
machineA:~$ mysql -h 127.0.0.1 -P 1111 -u root -p
Enter password:
ERROR 1698 (28000): Access denied for user 'root'@'localhost'
machineA:~$ mysql -h 127.0.0.1 -P 1111 -u root
ERROR 1698 (28000): Access denied for user 'root'@'localhost'
如果我尝试使用不是 root 帐户的帐户从计算机 B 登录 mysql,也会发生同样的情况。
如何登录 MySQL?
要连接到远程 MySQL 服务器,无论是直接连接还是通过 SSH 隧道,您都不能使用 unix_socket
身份验证插件,它需要本地访问 unix 套接字文件数据库服务器操作系统。
unix_socket
插件是使用一种特殊类型的文件(unix 套接字)实现的,它是 *nix 系统中 inter-process 通信 (IPC) 的一种形式。它允许您的 mysql CLI 客户端与数据库对话,并且需要本地访问套接字文件(即:/tmp/mysql.sock
)。当您连接到套接字时,unix_socket
插件 (server-side) 将获取连接到套接字的用户的 uid(即:youruser),并且无需密码即可自动对您进行身份验证。
可能的解决方案:
如果您使用 non-root 用户连接到机器 B,您需要创建一个与您的 non-root 操作系统用户帐户名同名的数据库用户。
GRANT ALL PRIVILEGES ON *.* TO 'youruser'@'localhost' IDENTIFIED VIA unix_socket;
现在您可以使用您的用户帐户和 mysql CLI 客户端连接到 mysql,只需 运行ning:
youruser:~$ mysql
如果您想使用 root 用户连接到数据库,那么您需要访问 root 帐户或与您的用户关联的 sudo 策略以 运行 mysql 客户端。
youruser:~$ sudo mysql
您显然可以启用对您的数据库根帐户的常规经过身份验证的网络访问。这可能会导致安全问题,因此最好将其限制为本地主机:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'127.0.0.1' IDENTIFIED BY 'xxx' WITH GRANT OPTION;
现在您可以从任何本地操作系统帐户登录,如果您可以验证您的登录:
youruser:~$ mysql -u root -p