为了在测试箱上复制某些脚本行为,我需要通过 unix 套接字使用 root 身份对 mysql 进行身份验证。
它与 sudo mysql 配合良好,但是当我执行 sudo mysql -h testhost 时,我得到:
ERROR 1698 (28000): Access denied for user 'root'@'localhost'
我已将 testhost 添加到我的 hosts 文件中
127.0.0.1 localhost testhost
我还更新了 mysql 授权
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED VIA unix_socket USING '*59D9CEFB549F231CFA8634AC47153FD4F3CCC29F' WITH GRANT OPTION |
| GRANT PROXY ON ''@'%' TO 'root'@'localhost' WITH GRANT OPTION
和
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED VIA unix_socket USING '*59D9CEFB549F231CFA8634AC47153FD4F3CCC29F'
答案1
“Unix 套接字”不是 TCP/IP 套接字。它们是总是仅限于当前系统 - 无法通过网络连接到另一个系统的套接字。
因此,主机名localhost
在 MySQL 中很特殊,客户端实际上并不会尝试查找其 IP 地址根本。当您连接到它时,您并不是连接到 127.0.0.1 也不是 ::1 – 您实际上连接到的是/var/run/mysqld/mysqld.sock
或某些类似的路径。
如果您想模拟网络连接,请运行mysql -h 127.0.0.1
或mysql -h ::1
。
网络 (TCP/IP) 连接不能使用IDENTIFIED VIA unix_socket
,因为它们不会传输客户端的 UID(尤其是不会以任何安全敏感的方式传输)。它们必须使用密码、X.509 证书或 GSSAPI。