MySQL mysql_config_editor 设置快速免密登录

作者: 不剪发的Tony老师
毕业于北京航空航天大学,十多年数据库管理与开发经验,目前在一家全球性的金融公司从事数据库架构设计。CSDN学院签约讲师以及GitChat专栏作者。csdn上的博客收藏于以下地址:https://tonydong.blog.csdn.net


从 MySQL 5.6 开始,提供了一个新的实用程序:mysql_config_editor,它允许你将身份认证信息存储到一个名为 .mylogin.cnf 的登录路径文件中,该文件的内容进行了混淆加密。对于 Windows 系统,该文件位于 %APPDATA%\MySQL 目录中;对于其他系统,该文件位于当前用户的家目录中。

配置了登录路径文件之后,MySQL 客户端程序连接服务器时可以使用其中的内容进行认证,不需要每次都输入登录信息。

先看没有进行设置之前的情况,我们使用 MySQL 8.0 版本,操作系统为 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 登录时,系统提示需要输入密码。接下来使用 mysql_config_editor 进行设置。

[root@mysql80 ~]# mysql_config_editor set --login-path=localroot --host=localhost --port=3306 --user=root --password
Enter password:

 

其中,set用于设置一个登录路径;--login-path用于指定登录路径名称,随后可以使用该名称进行登录;其他信息和直接登录时一样,执行该命令需要输入一次密码。

执行成功后,就会在当前用户的家目录(此处为 /root)中创建一个隐藏的文件,其中存储了我们设置的登录信息。

[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>

   

就是这么简单。以下为官方文档内容,仅供参考:

文件 .mylogin.cnf 未加密之前的内容和其他的选项文件类似,也是由多个选项组构成。每个选项组称为一个“登录路径”,其中只能包含以下特定的选项信息: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 和其他的选项文件获取相关信息。该文件的优先级比其他选项文件要高,但是比直接在命令行指定的参数优先级低。关于选项文件的优先级,可以参考 第 4.2.7 节,“使用选项文件”。

如果想要指定一个非默认的登录路径文件名,可以设置环境变量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 文件进行了混淆加密,因此无法直接明文读取;而且客户端程序对其内容进行解密后只在内存中进使用。通过这种方式,密码可以存储在一个非明文格式的文件中,随后可以使用这些加密密码,而不需要暴露在命令行参数或环境变量中。mysql_config_editor 提供了一个print命令,用于显示登录路径文件的内容,不过即使是这种情况下,密码仍然是加密后的值,因此绝对不会泄露给其他用户。

mysql_config_editor 使用的混淆处理可以防止密码在 .mylogin.cnf 文件中作为明文存储,并且提供了一个防止秘密无意泄露的安全措施。例如,如果将 my.cnf 选项文件中的信息显示在屏幕上,其中包含的密码信息也就显露无遗了。对于 .mylogin.cnf 文件,则不会发生这种情况。 尽管如此,该文件使用的混淆加密并非牢不可破。获取了系统管理权限的用户可以通过某些方式解密 .mylogin.cnf 文件中的内容。

登录路径文件必须是当前用可读写的,同时其他用户无法访问该文件。否则,mysql_config_editor 将会忽略该文件,客户端程序也不会使用。

[root@mysql80 ~]# ls .mylogin.cnf -l
-rw-------. 1 root root 156 Dec 20 02:56 .mylogin.cnf

 

调用 mysql_config_editor 的命令如下:

shell> mysql_config_editor [program_options] command [command_options]

   

如果登录路径文件不存在, mysql_config_editor 将会创建该文件。

命令参数如下:

    program_options包含通用的 mysql_config_editor 选项。
    command 表示针对登录文件 .mylogin.cnf 执行的操作。例如,set命令写入一个登录路径,remove命令删除一个登录路径,而print命令显示登录路径的内容。
    command_options为命令指定额外的选项,例如登录路径的名称和登录路径的配置参数。

程序参数中的命令名的位置非常重要。例如,以下命令具有相同的参数,但是结果并不相同:

shell> mysql_config_editor --help set
shell> mysql_config_editor set --help

  

第一行中的命令将会显示通用的 mysql_config_editor 帮助信息,并且忽略set命令。第二行命令将会显示set命令相关的帮助信息。

假设你想要创建一个登录路径 client,用于默认的连接参数,并且创建一个额外的登录路径 remote,用于连接主机 remote.example.com 上的 MySQL 服务器。你想要执行以下登录:

    默认情况下,使用用户 localuser 和密码 localpass 登录本地服务器。
    使用用户 remoteuser 和密码 remotepass 登录远程服务器。

想要在.mylogin.cnf 文件中创建这些登录路径,可以使用以下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 文件中的内容,可以使用print命令:

shell> mysql_config_editor print --all
[client]
user = localuser
password = *****
host = localhost
[remote]
user = remoteuser
password = *****
host = remote.example.com

  

print命令按组显示每个登录路径的信息,每个组以一个标题开始,标题即是登录路径名,使用方括号包含,然后是该登录路径的参数值。密码内容进行了加密,而不显示明文。

如果没有指定显示所有登录路径的--all选项或者显示指定登录路径的--login-path=name选项,print命令将会显示名为 client 的登录路径(如果存在该登录路径的话)。

如上示例所示,登录路径文件中可以存储多个登录路径。通过这种方式,mysql_config_editor 可以很方便地为用户连接不同的 MySQL 服务器,或者为不同用户连接同一个 MySQL 服务器设置多个配置。随后在调用客户端程序时,可以通过--login-path选项选择不同的登录路径。例如,使用以下命令可以连接到远程服务器:

shell> mysql --login-path=remote

   

此时,mysql客户端将会从其他选项文件中读取 [client] 和 [mysql] 选项组,并且从登录路径文件中读取 [client]、[mysql] 以及 [remote] 选项组。

如果要连接本地服务器,可以使用以下命令:

shell> mysql --login-path=client

   

由于mysql客户端默认就会读取 client 和 mysql 登录路径,此处的--login-path选项不会增加任何内容。该命令等价于:

shell> mysql

   

从登录路径文件中读取的选项组比其他文件中的选项组优先级更高。在登录径文件内,后面的配置选项可以覆盖前面的配置。

mysql_config_editor 按照执行命令的顺序添加登录路径,因此应该先创建更通用的登录路径,然后在创建更具体的登录路径。如果想要在登录路径文件中移动某个登录路径,可以先删除,然后在重建添加到最后。例如,登录路径 client 更通用,因为所有的客户端程序都会读取该路径;而登录路径 mysqldump 只会被 mysqldump 程序读取。后面的配置选项可以覆盖前面的配置,因此,按照 client、mysqldump 顺序指定的配置使得 mysqldump 相关的选项将会覆盖 client 选项。

使用 mysql_config_editor 的set命令创建登录路径时,不需要指定所有的选项值(主机名、用户名、密码、端口以及 socket )。可以为登录路径指定其中一部分选项值。任何连接所必须的参数可以连接 MySQL 服务器时再指定,可以通过其他选项文件或者在命令行中指定。命令行指定的选项比登录路径文件或其他选项文件优先级更高。例如,如果在登录路径 remote 中的参数也可以用于连接主机 remote2.example.com,可以使用以下命令连接到该主机上的服务器:

shell> mysql --login-path=remote --host=remote2.example.com

   

mysql_config_editor 通用选项

mysql_config_editor 支持以下通用选项,它们可以出现在任何其他命令之前。关于各种命令支持的特定选项,可以参考后文中的 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

生成调试日志。一个典型的 debug_options 配置就是 d:t:o,file_name。默认值为 d:t:o,/tmp/mysql_config_editor.trace。

    --verbose, -v

详细信息模式。显示更多的程序执行信息。该选项可以用于诊断问题。

    --version, -V

显示版本信息并退出。

mysql_config_editor 命令以及命令选项

本节介绍 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]

    以明文的形式显示登录路径的内容,不过密码总是显示为 *****。

    如果没有指定要显示的登录路径,默认值为 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 选项,才会从登录路径中删除相应内容。如果没有指定任意以上选项,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时才会写入登录路径。如果不包含任意以上参数,mysql_config_editor 将会写入一个的登录路径。

    set命令支持以下选项:

        --help, -?

        显示set命令的帮助信息并退出。

        要查看通用的帮助信息,使用mysql_config_editor --help。

        --host=host_name, -h host_name

        写入登录路径中的主机名。

        --login-path=name, -G name

        创建的登录路径名称。如果没有指定,默认为client。

        --password, -p

        提示输入一个密码。在 mysql_config_editor 显示提示信息后,输入密码并回车。为了防止其他用户看到输入的密码,mysql_config_editor 不会显示输入的内容。

        如果要指定一个空的密码,直接输入回车。此时写入文件的登录路径将会包含一行类似以下的内容:

        password =
           

        --port=port_num, -P port_num

        写入登录路径的 TCP/IP 端口号。

        --socket=file_name, -S file_name

        写入登录路径的 Unix socket 文件。例如,以下命令创建了一个使用 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关闭警告。