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