最安全的做法是使用 -p 参数不跟密码,执行时交互输入;其次用权限为600的~/.my.cnf配置文件存储凭证;避免明文密码出现在命令行、历史记录或进程列表中。

直接用 -p 参数(不跟密码)是最简单也最安全的做法,避免密码出现在命令历史、进程列表或 shell 日志里。
为什么不能写 -p123456 或 -ppassword
明文密码会暴露在 ps aux 进程快照、shell 历史(~/.bash_history)、系统审计日志甚至终端回滚缓冲区中。攻击者只要能登录服务器,几秒就能拿到密码。
-
mysqldump -u root -p123456 db > dump.sql—— 危险,密码可见 -
mysqldump -u root -p db > dump.sql—— 安全,执行后才交互式输入
更稳妥的方案:用 ~/.my.cnf 配置文件
把凭证存在加密权限受限的配置文件里,比每次输密码更可控,也适合脚本调用。
- 创建文件:
~/.my.cnf,内容如下:
[client] user = your_user password = your_password host = localhost
- 立刻设置权限:
chmod 600 ~/.my.cnf(否则mysqldump会拒绝读取) - 之后导出可直接运行:
mysqldump db_name > dump.sql,无需任何-u/-p - 注意:
~/.my.cnf中的host必须匹配你连接时的实际 host,否则可能连错实例
脚本中自动导出又不想存明文密码?用 MYSQL_PWD 环境变量(慎用)
这个变量能让 mysqldump 和 mysql 自动读取密码,但仅限临时场景——它依然会出现在 ps 输出中(部分旧版本 MySQL),且容易被父进程环境泄漏。
- 不推荐长期使用,仅用于一次性调试或容器内受控环境
- 示例:
MYSQL_PWD=secret mysqldump -u user db > dump.sql - 更安全的替代:用
gpg加密配置文件 + 启动时解密到内存临时文件,再读取
真正容易被忽略的是 ~/.my.cnf 的权限检查和 host 匹配逻辑——哪怕文件权限是 600,如果 host 写成 127.0.0.1 而你用 localhost 连,MySQL 会 fallback 到 socket 连接,但 client 段配置可能不生效,导致报错或静默失败。


















