MySQL mysql_config_editor 設置快速免密登錄
作者: 不剪發(fā)的Tony老師
畢業(yè)于北京航空航天大學,十多年數(shù)據(jù)庫管理與開發(fā)經(jīng)驗,目前在一家全球性的金融公司從事數(shù)據(jù)庫架構(gòu)設計。CSDN學院簽約講師以及GitChat專欄作者。csdn上的博客收藏于以下地址:https://tonydong.blog.csdn.net
從 MySQL 5.6 開始,提供了一個新的實用程序:mysql_config_editor,它允許你將身份認證信息存儲到一個名為 .mylogin.cnf 的登錄路徑文件中,該文件的內(nèi)容進行了混淆加密。對于 Windows 系統(tǒng),該文件位于 %APPDATA%\MySQL 目錄中;對于其他系統(tǒng),該文件位于當前用戶的家目錄中。
配置了登錄路徑文件之后,MySQL 客戶端程序連接服務器時可以使用其中的內(nèi)容進行認證,不需要每次都輸入登錄信息。
先看沒有進行設置之前的情況,我們使用 MySQL 8.0 版本,操作系統(tǒng)為 CentOS 7:
[root@mysql80 ~]# cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)
[root@mysql80 ~]# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 11
Server version: 8.0.13 MySQL Community Server - GPL
Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
我們在使用 root 登錄時,系統(tǒng)提示需要輸入密碼。接下來使用 mysql_config_editor 進行設置。
[root@mysql80 ~]# mysql_config_editor set --login-path=localroot --host=localhost --port=3306 --user=root --password
Enter password:
其中,set用于設置一個登錄路徑;--login-path用于指定登錄路徑名稱,隨后可以使用該名稱進行登錄;其他信息和直接登錄時一樣,執(zhí)行該命令需要輸入一次密碼。
執(zhí)行成功后,就會在當前用戶的家目錄(此處為 /root)中創(chuàng)建一個隱藏的文件,其中存儲了我們設置的登錄信息。
[root@mysql80 ~]# ls -l .mylogin.cnf
-rw-------. 1 root root 156 Dec 20 02:56 .mylogin.cnf
當我們再次登錄時,就可以使用登錄路徑,而不需要輸入密碼了:
[root@mysql80 ~]# mysql --login-path=localroot
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 12
Server version: 8.0.13 MySQL Community Server - GPL
Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
就是這么簡單。以下為官方文檔內(nèi)容,僅供參考:
文件 .mylogin.cnf 未加密之前的內(nèi)容和其他的選項文件類似,也是由多個選項組構(gòu)成。每個選項組稱為一個“登錄路徑”,其中只能包含以下特定的選項信息:host、user、password、port 以及 socket。每個選項組就是一系列連接選項,指定了要連接的 MySQL 服務器和賬戶信息。以下是一個未加密之前的登錄文件示例:
[client]
user = mydefaultname
password = mydefaultpass
host = 127.0.0.1
[mypath]
user = myothername
password = myotherpass
host = localhost
當你使用客戶端連接服務器時,客戶端將會使用 .mylogin.cnf 和其他的選項文件獲取相關信息。該文件的優(yōu)先級比其他選項文件要高,但是比直接在命令行指定的參數(shù)優(yōu)先級低。關于選項文件的優(yōu)先級,可以參考 第 4.2.7 節(jié),“使用選項文件”。
如果想要指定一個非默認的登錄路徑文件名,可以設置環(huán)境變量MYSQL_TEST_LOGIN_FILE。該變量可以被 mysql_config_editor 使用,同時也可以被標準的 MySQL 客戶端工具(mysql、mysqladmin 等等)以及測試工具 mysql-test-run.pl 讀取。
這些程序按照以下方式使用登錄路徑中的選項組:
如果沒有使用--login-path=name選項明確指定登錄路徑名,mysql_config_editor 默認使用 client 登錄路徑。
如果沒有指定--login-path選項,客戶端程序讀取它們在其他選項文件中使用的相同選項組。考慮以下命令:
shell> mysql
默認情況下,mysql 客戶端從其他選項文件中讀取 [client] 和 [mysql] 選項組,因此它也會從登錄路徑文件中讀取[client] 和 [mysql] 選項組。
如果指定了--login-path選項,客戶端程序還會從登錄路徑文件中讀取指定的登錄路徑。另外,還是會從其他選項文件中讀取默認的選項組。考慮以下命令:
shell> mysql --login-path=mypath
mysql 客戶端從其他選項文件中讀取 [client] 和 [mysql] 選項組,并且從登錄路徑文件中讀取 [client]、[mysql] 以及 [mypath] 選項組。
即使指定了--no-defaults選項,客戶端程序仍然會讀取登錄路徑文件。這種方式允許即使指定了--no-defaults,仍然可以更安全地使用密碼,而不是在命令行中直接輸入。
mysql_config_editor 對 .mylogin.cnf 文件進行了混淆加密,因此無法直接明文讀取;而且客戶端程序?qū)ζ鋬?nèi)容進行解密后只在內(nèi)存中進使用。通過這種方式,密碼可以存儲在一個非明文格式的文件中,隨后可以使用這些加密密碼,而不需要暴露在命令行參數(shù)或環(huán)境變量中。mysql_config_editor 提供了一個print命令,用于顯示登錄路徑文件的內(nèi)容,不過即使是這種情況下,密碼仍然是加密后的值,因此絕對不會泄露給其他用戶。
mysql_config_editor 使用的混淆處理可以防止密碼在 .mylogin.cnf 文件中作為明文存儲,并且提供了一個防止秘密無意泄露的安全措施。例如,如果將 my.cnf 選項文件中的信息顯示在屏幕上,其中包含的密碼信息也就顯露無遺了。對于 .mylogin.cnf 文件,則不會發(fā)生這種情況。 盡管如此,該文件使用的混淆加密并非牢不可破。獲取了系統(tǒng)管理權(quán)限的用戶可以通過某些方式解密 .mylogin.cnf 文件中的內(nèi)容。
登錄路徑文件必須是當前用可讀寫的,同時其他用戶無法訪問該文件。否則,mysql_config_editor 將會忽略該文件,客戶端程序也不會使用。
[root@mysql80 ~]# ls .mylogin.cnf -l
-rw-------. 1 root root 156 Dec 20 02:56 .mylogin.cnf
調(diào)用 mysql_config_editor 的命令如下:
shell> mysql_config_editor [program_options] command [command_options]
如果登錄路徑文件不存在, mysql_config_editor 將會創(chuàng)建該文件。
命令參數(shù)如下:
program_options包含通用的 mysql_config_editor 選項。
command 表示針對登錄文件 .mylogin.cnf 執(zhí)行的操作。例如,set命令寫入一個登錄路徑,remove命令刪除一個登錄路徑,而print命令顯示登錄路徑的內(nèi)容。
command_options為命令指定額外的選項,例如登錄路徑的名稱和登錄路徑的配置參數(shù)。
程序參數(shù)中的命令名的位置非常重要。例如,以下命令具有相同的參數(shù),但是結(jié)果并不相同:
shell> mysql_config_editor --help set
shell> mysql_config_editor set --help
第一行中的命令將會顯示通用的 mysql_config_editor 幫助信息,并且忽略set命令。第二行命令將會顯示set命令相關的幫助信息。
假設你想要創(chuàng)建一個登錄路徑 client,用于默認的連接參數(shù),并且創(chuàng)建一個額外的登錄路徑 remote,用于連接主機 remote.example.com 上的 MySQL 服務器。你想要執(zhí)行以下登錄:
默認情況下,使用用戶 localuser 和密碼 localpass 登錄本地服務器。
使用用戶 remoteuser 和密碼 remotepass 登錄遠程服務器。
想要在.mylogin.cnf 文件中創(chuàng)建這些登錄路徑,可以使用以下set命令。每個命令占用一行,并且在提示信息后輸入正確的密碼:
shell> mysql_config_editor set --login-path=client
--host=localhost --user=localuser --password
Enter password: # 在此輸入密碼 "localpass"
shell> mysql_config_editor set --login-path=remote
--host=remote.example.com --user=remoteuser --password
Enter password: 在此輸入密碼 "remotepass"
mysql_config_editor 默認使用 client 登錄路徑,因此在第一個命令中可以省略--login-path=client選項。
如果想要查看 .mylogin.cnf 文件中的內(nèi)容,可以使用print命令:
shell> mysql_config_editor print --all
[client]
user = localuser
password = *****
host = localhost
[remote]
user = remoteuser
password = *****
host = remote.example.com
print命令按組顯示每個登錄路徑的信息,每個組以一個標題開始,標題即是登錄路徑名,使用方括號包含,然后是該登錄路徑的參數(shù)值。密碼內(nèi)容進行了加密,而不顯示明文。
如果沒有指定顯示所有登錄路徑的--all選項或者顯示指定登錄路徑的--login-path=name選項,print命令將會顯示名為 client 的登錄路徑(如果存在該登錄路徑的話)。
如上示例所示,登錄路徑文件中可以存儲多個登錄路徑。通過這種方式,mysql_config_editor 可以很方便地為用戶連接不同的 MySQL 服務器,或者為不同用戶連接同一個 MySQL 服務器設置多個配置。隨后在調(diào)用客戶端程序時,可以通過--login-path選項選擇不同的登錄路徑。例如,使用以下命令可以連接到遠程服務器:
shell> mysql --login-path=remote
此時,mysql客戶端將會從其他選項文件中讀取 [client] 和 [mysql] 選項組,并且從登錄路徑文件中讀取 [client]、[mysql] 以及 [remote] 選項組。
如果要連接本地服務器,可以使用以下命令:
shell> mysql --login-path=client
由于mysql客戶端默認就會讀取 client 和 mysql 登錄路徑,此處的--login-path選項不會增加任何內(nèi)容。該命令等價于:
shell> mysql
從登錄路徑文件中讀取的選項組比其他文件中的選項組優(yōu)先級更高。在登錄徑文件內(nèi),后面的配置選項可以覆蓋前面的配置。
mysql_config_editor 按照執(zhí)行命令的順序添加登錄路徑,因此應該先創(chuàng)建更通用的登錄路徑,然后在創(chuàng)建更具體的登錄路徑。如果想要在登錄路徑文件中移動某個登錄路徑,可以先刪除,然后在重建添加到最后。例如,登錄路徑 client 更通用,因為所有的客戶端程序都會讀取該路徑;而登錄路徑 mysqldump 只會被 mysqldump 程序讀取。后面的配置選項可以覆蓋前面的配置,因此,按照 client、mysqldump 順序指定的配置使得 mysqldump 相關的選項將會覆蓋 client 選項。
使用 mysql_config_editor 的set命令創(chuàng)建登錄路徑時,不需要指定所有的選項值(主機名、用戶名、密碼、端口以及 socket )。可以為登錄路徑指定其中一部分選項值。任何連接所必須的參數(shù)可以連接 MySQL 服務器時再指定,可以通過其他選項文件或者在命令行中指定。命令行指定的選項比登錄路徑文件或其他選項文件優(yōu)先級更高。例如,如果在登錄路徑 remote 中的參數(shù)也可以用于連接主機 remote2.example.com,可以使用以下命令連接到該主機上的服務器:
shell> mysql --login-path=remote --host=remote2.example.com
mysql_config_editor 通用選項
mysql_config_editor 支持以下通用選項,它們可以出現(xiàn)在任何其他命令之前。關于各種命令支持的特定選項,可以參考后文中的 mysql_config_editor 命令以及命令選項。
表 4.17 mysql_config_editor 通用選項
--help, -?
顯示通用的幫助信息并退出。
如果想要查看關于具體命令的幫助信息,可以使用以下方式的mysql_config_editor命令,其中的 command 是一個非help的命令:
shell> mysql_config_editor command --help
--debug[=debug_options], -# debug_options
生成調(diào)試日志。一個典型的 debug_options 配置就是 d:t:o,file_name。默認值為 d:t:o,/tmp/mysql_config_editor.trace。
--verbose, -v
詳細信息模式。顯示更多的程序執(zhí)行信息。該選項可以用于診斷問題。
--version, -V
顯示版本信息并退出。
mysql_config_editor 命令以及命令選項
本節(jié)介紹 mysql_config_editor 支持的命令,以及每個命令相關的選項。
另外,mysql_config_editor 還支持一些通用的選項,在每個命令之前都可以指定。關于這些通用選項的描述,可以參考上面的 mysql_config_editor 通用選項。
mysql_config_editor 支持以下命令:
help
顯示幫助信息并退出。該命令不支持其他選項。
如果想要查看關于具體命令的幫助信息,可以使用以下方式的mysql_config_editor命令,其中的 command 是一個非help的命令:
shell> mysql_config_editor command --help
print [options]
以明文的形式顯示登錄路徑的內(nèi)容,不過密碼總是顯示為 *****。
如果沒有指定要顯示的登錄路徑,默認值為 client 。如果同時指定了--all和--login-path,生效的是--all。
print命令支持以下選項:
--help, -?
顯示print命令的幫助信息并退出。
要查看通用的幫助信息,使用mysql_config_editor --help。
--all
顯示所有的登錄路徑信息。
--login-path=name, -G name
顯示指定的登錄路徑信息。
remove [options]
從登錄路徑文件中刪除一個登錄路徑,或者從已有的登錄路徑中刪除選項。
只有指定了--host、--password、--port、--socket、--user 選項,才會從登錄路徑中刪除相應內(nèi)容。如果沒有指定任意以上選項,remove將會刪除整個登錄路徑。例如,以下命令從登錄路徑 mypath 中刪除 user 選項,而不會刪除整個登錄路徑:
shell> mysql_config_editor remove --login-path=mypath --user
以下命令刪除登錄路徑 mypath :
shell> mysql_config_editor remove --login-path=mypath
remove命令支持以下選項:
--help, -?
顯示remove命令的幫助信息并退出。
要查看通用的幫助信息,使用mysql_config_editor --help。
--host, -h
刪除登錄路徑中的主機名。
--login-path=name, -G name
指定要刪除或修改的登錄路徑。如果沒有指定,默認值為 client 。
--password, -p
刪除登錄路徑中的密碼。
--port, -P
刪除登錄路徑中的 TCP/IP 端口號。
--socket, -S
刪除登錄路徑中的 Unix socket 文件名。
--user, -u
刪除登錄路徑中的用戶名。
--warn, -w
如果嘗試刪除默認的登錄路徑(client),而沒有指定--login-path=client,將會警告并提示用戶確認。默認啟用警告提示;可以使用--skip-warn關閉警告。
reset [options]
清空登錄路徑文件。
The reset命令支持以下選項:
--help, -?
顯示reset命令的幫助信息并退出。
要查看通用的幫助信息,使用mysql_config_editor --help。
set [options]
寫入一個登錄路徑。
只有當選項為 --host、--password、--port、--socket或者--user時才會寫入登錄路徑。如果不包含任意以上參數(shù),mysql_config_editor 將會寫入一個的登錄路徑。
set命令支持以下選項:
--help, -?
顯示set命令的幫助信息并退出。
要查看通用的幫助信息,使用mysql_config_editor --help。
--host=host_name, -h host_name
寫入登錄路徑中的主機名。
--login-path=name, -G name
創(chuàng)建的登錄路徑名稱。如果沒有指定,默認為client。
--password, -p
提示輸入一個密碼。在 mysql_config_editor 顯示提示信息后,輸入密碼并回車。為了防止其他用戶看到輸入的密碼,mysql_config_editor 不會顯示輸入的內(nèi)容。
如果要指定一個空的密碼,直接輸入回車。此時寫入文件的登錄路徑將會包含一行類似以下的內(nèi)容:
password =
--port=port_num, -P port_num
寫入登錄路徑的 TCP/IP 端口號。
--socket=file_name, -S file_name
寫入登錄路徑的 Unix socket 文件。例如,以下命令創(chuàng)建了一個使用 socket 登錄的路徑:
[root@mysql80 ~]# mysql_config_editor set --login-path=localroot
--host=localhost --user=root --password
--socket=/var/lib/mysql/mysql.sock
--user=user_name, -u user_name
寫入登錄路徑的用戶名。
--warn, -w
如果嘗試覆蓋一個已有的登錄路徑,將會警告并提示用戶是否確認覆蓋。默認啟用告警提示;可以使用--skip-warn關閉警告。