四種輸入密碼方式風險分級
1. 命令行明文參數 -ppassword / --password=password —— 高風險
mysql -u user -psecret db_name
- 進程列表(
ps -ef、ps -f)可見密碼(部分版本顯示為星號,但 kill 時仍可見)。
- MySQL 客戶端初始化會用零覆蓋參數,但存在短暫可見窗口。
- 嚴禁生產環境使用。
2. 交互式提示 -p / --password(無參數) —— 低風險
mysql -u user -p db_name
Enter password: *********
- 終端不回顯,進程列表不可見。
- 僅適用於人工交互場景,腳本/自動化無法使用(首行可能被誤讀為密碼)。
3. 配置文件 [client] password=... —— 推薦(自動化/腳本)
# ~/.my.cnf
[client]
password=your_strong_password
- 權限必須
chmod 600 .my.cnf(僅擁有者讀寫)。
- MySQL 讀取順序:
/etc/my.cnf → /etc/mysql/my.cnf → MYSQL_HOME/my.cnf → ~/.my.cnf,後讀優先。
- Unix 下忽略「全局可寫」配置文件(安全機制)。
- Windows 下讀取
%APPDATA%\MySQL\.my.cnf 等路徑。
4. 環境變量 MYSQL_PWD —— 極高風險,禁止使用
ps 某版本可顯示環境變量,密碼完全暴露。
- 即使無此版本,進程內存亦可被讀取。
歷史文件風險防範
~/.mysql_history 記錄交互命令,含 CREATE USER、GRANT、SET PASSWORD 等明文密碼。權限設為 600。
- Shell 歷史(
~/.bash_history)同理,嚴格權限控制。
最佳實踐總結
| 場景 | 推薦方式 | 關鍵動作 |
| 人工登錄 | -p 交互式 | 無 |
| 腳本/自動化 | ~/.my.cnf [client] password | chmod 600 ~/.my.cnf |
| 應用連接池 | 配置文件/密碼管理系統 | 不落盤明文,運行時注入 |