分享至

简介

从可用性的角度来看,维护跨多个主机针对不同用户和数据库的凭据可能具有挑战性。如果您经常登录到多个 MySQL 服务器,或者您的项目出于安全原因而拥有具有独特权限的单独用户帐户,那么您很容易忘记如何连接到所需的帐户。

幸运的是,MySQL 提供了一个名为 mysql_config_editor 的小型实用程序,专门用于存储和管理 MySQL 凭据,以便您可以 轻松地使用 MySQL 客户端和工具进行身份验证。在本指南中,我们将介绍 mysql_config_editor 的工作原理、如何安全地管理多个凭据以及如何指示其他 MySQL 工具利用该配置来向您的服务器进行身份验证。

mysql_config_editor 如何工作?

mysql_config_editor 实用程序是 MySQL 安装程序中包含的一个小型程序,用于管理连接到不同 MySQL 服务器或不同帐户的凭据。它会加密凭据信息并将其存储在您主目录中名为 .mylogin.cnf 的文件中。

描述如何登录到 MySQL 帐户的每组凭据称为“登录路径”。这些通常指定帐户的用户名和密码,并且还可以存储有关如何连接到相应 MySQL 服务器的相关信息,例如 MySQL 侦听的主机名和端口。

MySQL 客户端和工具会自动配置为使用 .mylogin.cnf 文件中的信息来帮助登录到 MySQL 服务器。您可以在 MySQL 工具(例如 mysql 客户端)上使用 --login-path= 参数来指定应使用哪些登录详细信息。如果未提供登录路径,则工具将使用与默认登录路径(称为 client)关联的凭据,前提是它已定义。

如果登录路径未定义某些值,则 MySQL 客户端和工具将使用其配置的默认值。例如,如果您在使用 mysql_config_editor 创建登录路径时未指定主机,则 mysql 客户端会自动假设 localhost,就像您在命令行手动提供凭据时省略 --host= 选项一样。

通过创建新的登录路径来定义凭据

我们可以使用 mysql_config_editor 工具来设置新的登录路径。

定义新的登录路径的通用语法如下

mysql_config_editor set [options]

通常,您将包含以下一些选项

  • --login-path=:您要用于这些凭据的标签
  • --user=:帐户用户名
  • --password:一个标志,用于指示 mysql_config_editor 提示输入帐户密码。密码提示允许您安全地输入密码,这样它就不会像在命令行上直接提供密码那样记录到 shell 历史记录文件中。
  • --host=:托管 MySQL 服务器的主机名或 IP 地址。
  • --port=:MySQL 服务器侦听的端口号。
  • --socket=:如果您通过 Unix 套接字连接到本地服务器,则连接到的本地套接字文件的路径。

您只需要提供与 MySQL 实用程序的默认选项不同的信息。

在创建条目时,请记住 mysql_config_editor 无法在创建登录路径后编辑与其关联的详细信息。要更改任何详细信息,您需要重新指定所有相应的连接信息,以覆盖之前的条目。

设置本地帐户的连接信息

例如,要为本地 MySQL 服务器上的名为 salesadmin 的用户创建登录,您可以键入以下内容

mysql_config_editor set --login-path=sales --user=salesadmin --password

系统会提示您输入帐户密码,新的连接信息将保存到名为 sales.mylogin.cnf 文件中。我们使用 --user=salesadmin 提供帐户名称,并通过包含 --password 标志来指示 mysql_config_editor 提示输入密码。

由于这是一个本地帐户,如果在类 Unix 系统上运行,它将通过本地套接字文件连接。但是,如果您未修改 MySQL 以使其以不同的方式运行,则 MySQL 工具将知道该怎么做,您在配置时无需提供这些详细信息。

设置远程帐户的连接信息

要保存远程用户名testuser在名为dev.example.com的主机上端口 5555 上监听的 MySQL 服务器的连接信息,您可以键入

mysql_config_editor set --login-path=testing --user=testuser --password --host=dev.example.com --port=5555

testing登录路径的条目将包含所有必需的信息,以便自动连接到托管在dev.example.com上的 MySQL 数据库,使用用户帐户testuser

设置默认连接信息

MySQL 工具旨在在没有明确的连接信息的情况下被调用时使用合理的默认值。例如,在类 Unix 系统上,如果未覆盖,它们将尝试使用以下详细信息进行连接

  • 用户:您的操作系统用户名
  • 密码:无密码
  • 主机localhost,默认情况下,这意味着您将通过平台的默认位置的 Unix 套接字进行连接。

如果这些选项不适合您的用例,您可以使用mysql_config_editor更改默认连接信息。为此,请提供您想默认使用的连接信息,而无需指定登录路径。

例如

mysql_config_editor set --user=root --password

这将在通用client登录路径下存储连接信息,MySQL 工具在未提供其他登录路径时会读取该路径。

使用登录路径登录

要使用您配置的连接信息,请在命令行上使用--login-path=与 MySQL 客户端和工具一起指定。

例如,要登录到之前配置的本地salesadmin帐户,我们可以告诉mysql使用sales登录路径

mysql --login-path=sales

要使用testuser帐户登录到dev.example.com服务器,我们可以改为指定testing登录路径

mysql --login-path=testing

如果您在没有--login-path=的情况下调用mysql,它将检查您配置的client登录路径,并尝试使用root帐户登录到您的本地数据库

mysql

在每种情况下,您都将登录到相应的帐户,而无需提供任何其他详细信息。

您可以通过键入以下内容来验证您连接到的用户

SELECT user();
+----------------------+
| user() |
+----------------------+
| salesadmin@localhost |
+----------------------+
1 row in set (0.00 sec)

如果您想验证用户以及您连接到的方法,可以使用status命令

status
--------------
mysql Ver 8.0.27-0ubuntu0.20.04.1 for Linux on x86_64 ((Ubuntu))
Connection id: 28
Current database:
Current user: sammy@localhost
SSL: Not in use
Current pager: stdout
Using outfile: ''
Using delimiter: ;
Server version: 8.0.27-0ubuntu0.20.04.1 (Ubuntu)
Protocol version: 10
Connection: Localhost via UNIX socket
Server characterset: utf8mb4
Db characterset: utf8mb4
Client characterset: utf8mb4
Conn. characterset: utf8mb4
UNIX socket: /var/run/mysqld/mysqld.sock
Binary data as: Hexadecimal
Uptime: 1 day 21 hours 37 min 49 sec
Threads: 2 Questions: 66 Slow queries: 0 Opens: 186 Flush tables: 3 Open tables: 105 Queries per second avg: 0.000
--------------

您可以在Current user下看到当前用户,但您也可以查看有关您如何连接到服务器的详细信息,方法是查看ConnectionUNIX socket项目。

显示可用的登录路径

虽然您定义的连接详细信息存储在您主目录中的名为.mylogin.cnf的文件中,但内容已加密以确保安全。要查看配置的信息,您需要再次使用mysql_config_editor

要查看您配置的默认登录信息,该信息存储在client登录路径下,您可以使用print子命令,而无需任何其他选项

mysql_config_editor print
[client]
user = "root"
password = *****

MySQL 使用INI 风格的文件格式在适当的登录路径标签下对连接详细信息进行分组。您可能还会注意到密码被隐藏。同样,这也是一项安全措施,旨在防止泄露保存的密码。

要查看不同的登录路径,您可以像往常一样提供--login-path=选项

mysql_config_editor print --login-path=testing
[testing]
user = "testuser"
password = *****
host = "dev.example.com"
port = 5555

要显示所有配置的登录路径,可以添加--all标志

mysql_config_editor print --all
[sales]
user = "salesadmin"
password = *****
[testing]
user = "testuser"
password = *****
host = "dev.example.com"
port = 5555
[client]
user = "root"
password = *****

删除连接信息

您可以使用remove子命令删除与登录路径关联的连接信息。提供--login-path将允许mysql_config_editor定位适当的条目。

例如,要删除sales登录路径的连接信息,您可以键入

mysql_config_editor remove --login-path=sales

如果您检查配置的条目,您会发现sales登录路径已被删除

mysql_config_editor print --all
[testing]
user = "testuser"
password = *****
host = "dev.example.com"
port = 5555
[client]
user = "root"
password = *****

您还可以从登录路径的连接信息中删除特定参数。例如,如果"dev.example.com"上的 MySQL 服务器已重新配置为现在在默认的 3306 端口上运行,则可以删除端口信息。为此,您需要提供--port标志以及--login-path=

mysql_config_editor remove --login-path=testing --port

您可以通过再次打印条目来验证端口规范是否已从testing登录路径中删除

mysql_config_editor print --all
[testing]
user = "testuser"
password = *****
host = "dev.example.com"
[client]
user = "root"
password = *****

您也可以通过键入以下内容来删除所有登录路径并创建一个新的空白.mylogin.cnf文件

mysql_config_editor reset

这将删除所有配置的登录路径。

结论

在本指南中,我们介绍了mysql_config_editor,它是 MySQL 的小型实用程序之一,旨在通过管理连接信息来改善用户体验。我们介绍了如何使用登录路径配置连接信息以及如何使用配置的凭据调用 MySQL 工具。我们还讨论了如何覆盖默认值和管理现有登录路径信息。

通过利用mysql_config_editor和 MySQL 项目提供的其他工具,您可以消除在从单个位置管理多个项目时可能出现的某些挫折。它是一个相对简单的工具的良好示例,旨在简化重复且容易出错的任务,帮助您专注于更重要的工作。

关于作者
Justin Ellingwood

Justin Ellingwood

Justin 自 2013 年以来一直在撰写有关数据库、Linux、基础设施和开发人员工具的文章。他目前与妻子和两只兔子住在柏林。他通常不必以第三人称写作,这对所有相关方来说都是一种解脱。