分享到

簡介

從可用性角度來看,在各種主機上維護不同使用者和資料庫的憑證可能具有挑戰性。如果您定期登入到多個 MySQL 伺服器,或者您的專案出於安全原因擁有具有獨特許可權的獨立使用者帳戶,您可能會很容易忘記如何連線到所需的帳戶。

幸運的是,MySQL 提供了一個名為 mysql_config_editor 的小型實用程式,專門用於儲存和管理 MySQL 憑證,以便您可以使用 MySQL 客戶端和工具輕鬆進行身份驗證。在本指南中,我們將介紹 mysql_config_editor 的工作原理、如何安全地管理多個憑證以及如何讓其他 MySQL 工具利用配置對您的伺服器進行身份驗證。

mysql_config_editor 如何工作?

mysql_config_editor 實用程式是 MySQL 安裝中包含的一個小型程式,用於管理連線到不同 MySQL 伺服器或不同帳戶的憑證。它將憑證資訊加密並存儲在您主目錄中名為 .mylogin.cnf 的檔案中。

每組描述如何登入 MySQL 帳戶的憑證都稱為“登入路徑”(login path)。這些通常指定帳戶的使用者名稱和密碼,還可以額外儲存有關如何連線到相應 MySQL 伺服器的相關資訊,例如 MySQL 監聽的主機名和埠。

MySQL 客戶端和工具會自動配置為使用 .mylogin.cnf 檔案中的資訊來幫助登入 MySQL 伺服器。您可以在 MySQL 工具(如 mysql 客戶端)上使用 --login-path= 引數來指定應使用哪個登入詳細資訊。如果未提供登入路徑,工具將使用與預設登入路徑(稱為 client)關聯的憑證(如果已定義)。

如果登入路徑未定義某些值,MySQL 客戶端和工具將改用其配置的預設值。例如,如果在使用 mysql_config_editor 建立登入路徑時未指定主機,mysql 客戶端將自動假定為 localhost,就像您在命令列上手動提供憑證時省略 --host= 選項一樣。

透過建立新的登入路徑定義憑證

我們可以使用 mysql_config_editor 工具來設定一個新的登入路徑。

定義新登入路徑的一般語法如下

mysql_config_editor set [options]

通常,您會包含以下一些選項

  • --login-path=:您希望用於這些憑證的標籤
  • --user=:帳戶使用者名稱
  • --password:一個標誌,用於指示 mysql_config_editor 提示輸入帳戶密碼。密碼提示允許您安全地輸入密碼,這樣它就不會像直接在命令列中提供那樣被記錄到 shell 歷史檔案中。
  • --host=:託管 MySQL 伺服器的主機名或 IP 地址。
  • --port=:MySQL 伺服器監聽的埠號。
  • --socket=:如果您透過 Unix 套接字連線到本地伺服器,則為本地套接字檔案的路徑。

您只需提供與 MySQL 實用程式預設選項不同的資訊。

建立條目時,請記住 mysql_config_editor 不提供編輯登入路徑建立後與其關聯的詳細資訊的方式。要更改任何詳細資訊,您需要再次重新指定所有相應的連線資訊以覆蓋以前的條目。

為本地帳戶設定連線資訊

例如,要在本地 MySQL 伺服器上為名為 salesadmin 的使用者建立登入,您可以輸入

mysql_config_editor set --login-path=sales --user=salesadmin --password

您將收到帳戶密碼提示,新的連線資訊將儲存到 .mylogin.cnf 檔案中,標籤名為 sales。我們透過 --user=salesadmin 提供帳戶名,並透過包含 --password 標誌來指示 mysql_config_editor 提示輸入密碼。

由於這是本地帳戶,如果在類 Unix 系統上執行,它將透過本地套接字檔案連線。但是,如果您沒有修改 MySQL 以使其執行方式不同,MySQL 工具將知道如何操作,您無需在配置時提供這些詳細資訊。

為遠端帳戶設定連線資訊

要在監聽埠 5555 的主機 dev.example.com 上的 MySQL 伺服器上儲存遠端使用者 testuser 的連線資訊,您可以輸入

mysql_config_editor set --login-path=testing --user=testuser --password --host=dev.example.com --port=5555

testing 登入路徑的條目將包含自動連線到 dev.example.com 上託管的 MySQL 資料庫所需的所有資訊,使用使用者帳戶 testuser

設定預設連線資訊

MySQL 工具設計為在沒有明確連線資訊的情況下呼叫時使用合理的預設值。例如,在類 Unix 系統上,如果未被覆蓋,它們將嘗試使用以下詳細資訊進行連線

  • 使用者:您的作業系統使用者名稱
  • 密碼:無密碼
  • 主機:localhost,預設情況下表示您將透過 Unix 套接字連線到平臺的預設位置。

如果這些選項不適用於您的用例,您可以使用 mysql_config_editor 更改預設連線資訊。為此,請提供您希望預設使用的連線資訊,而無需指定登入路徑。

例如

mysql_config_editor set --user=root --password

這會將連線資訊儲存在通用 client 登入路徑下,當未提供其他登入路徑時,MySQL 工具會讀取此路徑。

使用登入路徑登入

要使用您已配置的連線資訊,請在命令列上使用 MySQL 客戶端和工具指定 --login-path=

例如,要登入到之前配置的本地 salesadmin 帳戶,我們可以告訴 mysql 使用 sales 登入路徑

mysql --login-path=sales

要使用 testuser 帳戶登入到 dev.example.com 伺服器,我們可以改為指定 testing 登入路徑

mysql --login-path=testing

如果您呼叫 mysql 時不帶 --login-path=,它將檢查您配置的 client 登入路徑,並嘗試使用 root 帳戶將您登入到本地資料庫

mysql

在每種情況下,您都將登入到相應的帳戶,而無需提供任何額外詳細資訊。

您可以透過輸入以下命令來驗證您連線的使用者身份

SELECT user();
+----------------------+
| user() |
+----------------------+
| salesadmin@localhost |
+----------------------+
1 row in set (0.00 sec)

如果您想驗證使用者和連線方法,可以改用 status 命令

status
--------------
mysql Ver 8.0.27-0ubuntu0.20.04.1 for Linux on x86_64 ((Ubuntu))
Connection id: 28
Current database:
Current user: sammy@localhost
SSL: Not in use
Current pager: stdout
Using outfile: ''
Using delimiter: ;
Server version: 8.0.27-0ubuntu0.20.04.1 (Ubuntu)
Protocol version: 10
Connection: Localhost via UNIX socket
Server characterset: utf8mb4
Db characterset: utf8mb4
Client characterset: utf8mb4
Conn. characterset: utf8mb4
UNIX socket: /var/run/mysqld/mysqld.sock
Binary data as: Hexadecimal
Uptime: 1 day 21 hours 37 min 49 sec
Threads: 2 Questions: 66 Slow queries: 0 Opens: 186 Flush tables: 3 Open tables: 105 Queries per second avg: 0.000
--------------

您可以在 Current user 下檢視當前使用者,但也可以透過檢視 ConnectionUNIX socket 條目來檢視您如何連線到伺服器的詳細資訊。

顯示可用登入路徑

雖然您定義的連線詳細資訊儲存在主目錄中名為 .mylogin.cnf 的檔案中,但內容是加密的以確保安全。要檢視配置的資訊,您需要再次使用 mysql_config_editor

要檢視您已配置的預設登入資訊(儲存在 client 登入路徑下),您可以使用 print 子命令,無需任何額外選項

mysql_config_editor print
[client]
user = "root"
password = *****

MySQL 使用 INI 樣式檔案格式在相應的登入路徑標籤下分組連線詳細資訊。您可能還會注意到密碼被遮掩了。這再次是一種安全措施,以防洩露儲存的密碼。

要檢視不同的登入路徑,您可以像往常一樣提供 --login-path= 選項

mysql_config_editor print --login-path=testing
[testing]
user = "testuser"
password = *****
host = "dev.example.com"
port = 5555

要顯示所有已配置的登入路徑,您可以改為新增 --all 標誌

mysql_config_editor print --all
[sales]
user = "salesadmin"
password = *****
[testing]
user = "testuser"
password = *****
host = "dev.example.com"
port = 5555
[client]
user = "root"
password = *****

移除連線資訊

您可以使用 remove 子命令移除與登入路徑關聯的連線資訊。提供 --login-path 將允許 mysql_config_editor 定位到相應的條目。

例如,要移除 sales 登入路徑的連線資訊,您可以輸入

mysql_config_editor remove --login-path=sales

如果您檢查配置的條目,您會發現 sales 登入路徑已被移除

mysql_config_editor print --all
[testing]
user = "testuser"
password = *****
host = "dev.example.com"
port = 5555
[client]
user = "root"
password = *****

您還可以從登入路徑的連線資訊中移除特定引數。例如,如果 "dev.example.com" 上的 MySQL 伺服器已重新配置為現在在預設的 3306 埠上執行,您可以移除埠資訊。為此,您需要提供 --port 標誌以及 --login-path=

mysql_config_editor remove --login-path=testing --port

您可以透過再次列印條目來驗證埠規範已從 testing 登入路徑中移除

mysql_config_editor print --all
[testing]
user = "testuser"
password = *****
host = "dev.example.com"
[client]
user = "root"
password = *****

您還可以透過輸入以下命令刪除所有登入路徑並建立一個新的空白 .mylogin.cnf 檔案

mysql_config_editor reset

這會移除所有已配置的登入路徑。

總結

在本指南中,我們探討了 mysql_config_editor,它是 MySQL 的小型實用程式之一,旨在透過管理連線資訊來改善使用者體驗。我們介紹瞭如何使用登入路徑配置連線資訊,以及如何使用我們配置的憑證呼叫 MySQL 工具。我們還討論瞭如何覆蓋預設值以及管理現有登入路徑資訊。

透過利用 mysql_config_editor 和 MySQL 專案提供的其他工具,您可以消除從單個位置管理多個專案時可能出現的一些挫敗感。它是一個相對簡單的工具的良好範例,旨在簡化重複、易出錯的任務,幫助您專注於更重要的工作。

關於作者
Justin Ellingwood

Justin Ellingwood

Justin 自 2013 年以來一直撰寫關於資料庫、Linux、基礎設施和開發者工具的文章。他目前與妻子和兩隻兔子住在柏林。他通常不必以第三人稱寫作,這對所有相關方來說都是一種解脫。
© . This site is unofficial and not affiliated with Prisma Data, Inc.