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