MySQL mysql_config_editor 设置快速免密登录

1. MySQL mysql_config_editor 设置快速免密登录

1.1. 背景

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

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

1.2. 配置实例

1.先看没有进行设置之前的情况,我们使用 MySQL 8.0 版本,操作系统为 CentOS 7:

[root@mysql80 ~]# mysql -uroot -p
Enter password: 

2.我们在使用 root 登录时,系统提示需要输入密码。接下来使用 mysql_config_editor 进行设置。

[root@mysql80 ~]# mysql_config_editor set --login-path=localroot --host=localhost --port=3306 --user=root --password --socket=/data/mysql/data3307/mysql3307.sock
Enter password:

其中,set用于设置一个登录路径;
--login-path用于指定登录路径名称,随后可以使用该名称进行登录;
其他信息和直接登录时一样,执行该命令需要输入一次密码。
  1. 执行成功后,就会在当前用户的家目录(此处为 /root)中创建一个隐藏的文件,其中存储了我们设置的登录信息。
[root@mysql80 ~]# ls -l .mylogin.cnf 
-rw-------. 1 root root 156 Dec 20 02:56 .mylogin.cnf

4.当我们再次登录时,就可以使用登录路径,而不需要输入密码了:

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

1.3. 参数介绍:

mysql_config_editor对应的参数信息如下:

·          help 显示帮助

·         --login-path=name,-G name

·         --host=host_name,-h host_name 主机名

·         --password,-p 密码,注意这个地方不能使用“=”直接写入密码

·         --port=port_num,-P port_num 端口号

·         --socket=file_names,-S file_name 文件名

·         --user=user_name,-u user_name 用户名

·         --warn,-w 默认开启,提示警告信息,如果要忽略警告,使用--skip-warn 参数

1.4. 官方说明

以下为官方文档内容,仅供参考:
文件 .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 读取。

这些程序按照以下方式使用登录路径中的选项组:

1.如果没有使用--login-path=name选项明确指定登录路径名,mysql_config_editor 默认使用 client 登录路径。

2.如果没有指定--login-path选项,客户端程序读取它们在其他选项文件中使用的相同选项组。考虑以下命令:
shell> mysql

默认情况下,mysql 客户端从其他选项文件中读取 [client] 和 [mysql] 选项组,因此它也会从登录路径文件中读取[client] 和 [mysql] 选项组。

3.如果指定了--login-path选项,客户端程序还会从登录路径文件中读取指定的登录路径。另外,还是会从其他选项文件中读取默认的选项组。考虑以下命令:
shell> mysql --login-path=mypath

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

即使指定了--no-defaults选项,客户端程序仍然会读取登录路径文件。这种方式允许即使指定了--no-defaults,仍然可以更安全地使用密码,而不是在命令行中直接输入。

1.4.1. 加密问题

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选项。

1.4.2. 查看.mylogin.cnf文件内容

如果想要查看 .mylogin.cnf 文件中的内容,可以使用print命令:
1.查看所有的login path信息

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

2.查看名为dbadmin的配置
mysql_config_editor print --login-path=dbadmin

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

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

1.4.3. 清空配置login path

mysql_config_editor reset

mysql_config_editor print --all

1.4.4. 删除配置login path

mysql_config_editor remove --login-path=dbadmin

也可以删除login path中的某一个项。
-h,–host=name 添加host到登陆文件中

-G,–login-path=name 在登录文件中为login path添加名字(默认为client)

-p,–password 在登陆文件中添加密码(该密码会被mysql_config_editor自动加密)

-u,–user 添加用户名到登陆文件中

-S,–socket=name 添加sock文件路径到登陆文件中

-P,–port=name 添加登陆端口到登陆文件中

1.4.5. mysql_config_editor的特殊符号问题

1:mysql_config_editor can not deal password with "#"
使用mysql_config_editor创建了login path后,使用是遇到这个错误。

  1. mysql --login-path=admin
    ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
    出错的原因是账号密码中包含特殊字符#,在创建login path的时候必须用双引号将密码包裹,才可以避免遇到这种错误。其实这个也不完全算一个Bug,因为解析.mylogin.cnf文件时,将#当成了注释符号。
    The problem is that the .mylogin.cnf file interprets the # as the beginning of a comment.

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

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

1.4.6. 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 支持以下命令:

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 不会显示输入的内容。

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

--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关闭警告。

1.4.7. 查看帮助

mysql_config_editor --help
mysql_config_editor Ver 1.0 Distrib 5.7.30, for Linux on x86_64
Copyright (c) 2012, 2020, 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.
 
MySQL Configuration Utility.
Usage: mysql_config_editor [program options] [command [command options]]
  -#, --debug[=#]     This is a non-debug version. Catch this and exit.
  -?, --help          Display this help and exit.
  -v, --verbose       Write more information.
  -V, --version       Output version information and exit.
 
Variables (--variable-name=value)
and boolean options {FALSE|TRUE}  Value (after reading options)
--------------------------------- ----------------------------------------
verbose                           FALSE
 
Where command can be any one of the following :
       set [command options]     Sets user name/password/host name/socket/port
                                 for a given login path (section).
       remove [command options]  Remove a login path from the login file.
       print [command options]   Print all the options for a specified
                                 login path.
       reset [command options]   Deletes the contents of the login file.
       help                      Display this usage/help information.
posted @ 2025-07-07 14:55  数据库小白(专注)  阅读(222)  评论(0)    收藏  举报