分享到

简介

从可用性的角度来看,维护跨各种主机的不同用户和数据库的凭据可能具有挑战性。如果您定期登录到多个 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 工具在未提供其他登录路径时会读取该路径。

使用登录路径登录

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

例如,要登录到之前配置的本地 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

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