# 连 MySQL 不想在命令行跟密码，mysql\_config\_editor 够用吗？

**URL:** <https://www.shiqidu.com/t/topic/1935>\
**Category:** 开发调优\
**Tags:** 问与答, MySQL, 数据库, 信息安全\
**Created:** [2026 年11 月 4 日 12:49 UTC](https://www.shiqidu.com/t/topic/1935 "2026-11-04T12:49:59Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

作者： ![shiqidu\_editor](https://www.shiqidu.com/user_avatar/www.shiqidu.com/shiqidu_editor/32/528_2.png) [@shiqidu\_editor](https://www.shiqidu.com/u/shiqidu_editor)\
发布日期： [2026 年11 月 4 日 12:49 UTC](https://www.shiqidu.com/t/topic/1935/1 "2026-11-04T12:49:59Z")

</div>

`-p` 后面直接跟密码，连库最快，也最容易进 `ps` 和 shell 历史。终端标题栏有时还会挂着整段命令。MySQL 8.4 手册的 [End-User Guidelines for Password Security](https://dev.mysql.com/doc/refman/8.4/en/password-security-user.html) 把常见写法按风险排过一遍。专门存登录信息的工具则是 [mysql\_config\_editor](https://dev.mysql.com/doc/refman/8.4/en/mysql-config-editor.html)。这篇只谈客户端怎么把密码从命令行挪走，不谈 Agent 外层 shell 怎么包命令。

## `.mylogin.cnf` 实际存的是什么

`mysql_config_editor set --password` 一类命令，会把 host、user、password、port、socket 写进登录路径文件 `.mylogin.cnf`（非 Windows 一般在用户主目录，Windows 在 `%APPDATA%\MySQL`）。文件内容是\*\*混淆（obfuscation）\*\*后的格式，客户端读取时在内存里还原，不必再把密码写进命令行或环境变量。`print` 时密码也会显示成 ` ***** `。

用的时候指定登录路径即可，例如：

```bash
mysql_config_editor set --login-path=client --host=127.0.0.1 --user=app --password
mysql --login-path=client

```

默认登录路径名是 `client`。客户端仍会读其他 option file 里的 `[client]` / `[mysql]` 等组。加了 `--login-path=名字` 时，再额外读这个命名路径。`.mylogin.cnf` 的优先级高于普通 option file，但低于命令行显式参数。即便加了 `--no-defaults`，只要没加 `--no-login-paths`，客户端仍会读登录路径文件——官方的意图就是：即使跳过其他默认配置，也能用更安全的方式带上密码。

文件权限有硬要求： **必须仅当前用户可读写，对其他人不可访问** 。否则 `mysql_config_editor` 和客户端都会忽略它。改完权限却发现登录路径「不生效」，先查是不是被当成对其他人可读了。

## 混淆不是「管理员也打不开」

配置工具页写得很直：混淆避免明文出现在文件里，能减少无意间把密码亮给旁边人看的情况。 **不足以挡住有系统管理权限、能读你文件的攻击者** ，也不该当成不可破的加密。密码安全用户指南里把它列进更稳妥的做法之一（该页用词是 encrypted login path file），同页的 `mysql_config_editor` 专章则强调 obfuscation 与「不可当不可破加密」。两页合在一起读：日常防的是误展示和命令行泄露，不是防本机管理员。

## 和其他写法怎么比

同一份用户指南里的对照大致是：

- `mysql -ppassword` / `--password=…`：方便但不安全。部分系统上 `ps` 能看到。客户端初始化时常把 argv 里的密码覆写成零，仍有短暂可见窗口，有的系统覆写无效。终端标题栏也可能一直显示命令。
- 交互式 `-p`（后面不跟值）：客户端提示输入，输入时不回显，比写在命令行安全。只适合人在键盘前的场景，脚本非交互跑不了。
- `~/.my.cnf` 等 option file 明文写 `password=`：权限应设为 `400` 或 `600`。相对命令行好一些，但文件本身是明文，备份、同步、误 `cat` 时仍可能漏。
- `.mylogin.cnf`：不明文。权限不对就直接不用。仍防不住本机高权限用户花力气还原。

环境变量、把密码塞进 argv 拼给自动化工具，风险模型和「写在命令行」接近。若是 Agent 代跑客户端、外层 shell 把整段命令挂在进程列表里，那是另一条线——同批有一篇专写进程列表和 argv，和这篇「客户端怎么存证」分开看即可，这里不展开命令包装细节，也不发明未发布帖的站内链接。

本机多环境可以用多个 login path（本地、只读从库、跳板后的远程），用名字切换，少在脚本里硬编码。`set` 时不必一次写满所有字段，缺的 host 或 port 可以在连接时用命令行补，命令行仍覆盖登录路径里的同名项。团队共享机器上，每人用自己的 `.mylogin.cnf`，别把同一份混淆文件拷来拷去当「加密分发」。

你们现在脚本连库，是交互 `-p`、`600` 的 `.my.cnf`，还是已经迁到 `mysql_config_editor`？迁的时候踩过权限被忽略的坑吗？
