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)閉警告。