分享到

簡介

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

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

mysql_config_editor 如何運作?

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

每個描述如何登入 MySQL 帳戶的憑證集都稱為「登入路徑」。這些通常指定帳戶的使用者名稱和密碼,並且還可以額外儲存有關如何連線到適當 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 socket 連線到本機伺服器,則為本機 socket 檔案的路徑。

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

在建立條目時,請記住,mysql_config_editor 沒有提供在建立登入路徑後編輯與其關聯的詳細資訊的方法。若要變更任何詳細資訊,您需要再次重新指定所有適當的連線資訊,以覆寫先前的條目。

設定本機帳戶的連線資訊

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

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

系統將提示您輸入帳戶密碼,並且新的連線資訊將以名為 sales 的標籤儲存到 .mylogin.cnf 檔案中。我們使用 --user=salesadmin 提供帳戶名稱,並透過包含 --password 旗標來告知 mysql_config_editor 提示輸入密碼。

由於這是本機帳戶,因此如果在本機類 Unix 系統上執行,它將透過本機 socket 檔案連線。但是,如果您未修改 MySQL 以不同的方式執行,則 MySQL 工具將知道該怎麼做,並且您在設定時無需提供這些詳細資訊。

設定遠端帳戶的連線資訊

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

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 socket 在平台的預設位置進行連線。

如果這些選項不適合您的使用案例,您可以使用 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

如果您在沒有 --login-path= 的情況下呼叫 mysql,它將檢查您設定的 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、基礎架構和開發人員工具的文章。他目前與妻子和兩隻兔子住在柏林。他通常不必以第三人稱寫作,這對所有相關方來說都是一種解脫。