![在 mysql 中使用 unix_socket 與 localhost 以外的主機](https://rvso.com/image/1609693/%E5%9C%A8%20mysql%20%E4%B8%AD%E4%BD%BF%E7%94%A8%20unix_socket%20%E8%88%87%20localhost%20%E4%BB%A5%E5%A4%96%E7%9A%84%E4%B8%BB%E6%A9%9F.png)
為了在測試盒上複製一些腳本行為,我需要透過 unix 套接字使用 root 對 mysql 進行身份驗證。
它與 sudo mysql 一起工作正常,但是當我執行 sudo mysql -h testhost 時,我得到:
ERROR 1698 (28000): Access denied for user 'root'@'localhost'
我已將 testhost 新增到我的主機檔案中
127.0.0.1 localhost testhost
我還更新了 mysql grants
| 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。