自動化部署、備份腳本常需非互動式登入 MySQL。除 mysql_config_editor (5.6.6+)、.mylogin.cnf、環境變數 MYSQL_PWD 外,**Expect** 是通用且強大的選擇,可模擬人工輸入密碼、處理多因子提示。本文提供最小可用腳本與進階模板。
#!/usr/bin/expect
# 檔名:mysql_auto.exp,chmod +x mysql_auto.exp
spawn /usr/local/mysql/bin/mysql -u app_user -p
expect {
"assword:" { send "AppPass123\r" }
"Enter password:" { send "AppPass123\r" }
timeout { send_user "連線逾時\n"; exit 1 }
eof { send_user "連線中斷\n"; exit 1 }
}
interact # 將控制權交還使用者,進入互動模式
執行:./mysql_auto.exp 即可直接進入 mysql> 提示符。
#!/usr/bin/expect
# 用法:./mysql_adv.exp host user pass "SQL語句"
if {$argc != 4} {
send_user "Usage: $argv0 host user password \"sql\"\n"
exit 1
}
set host [lindex $argv 0]
set user [lindex $argv 1]
set pass [lindex $argv 2]
set sql [lindex $argv 3]
spawn mysql -h $host -u $user -p
set timeout 10
expect {
"assword:" { send "$pass\r" }
timeout { send_user "連線逾時: $host\n"; exit 1 }
}
expect "mysql>"
send "$sql\r"
expect "mysql>"
send "exit\r"
expect eof
#!/bin/bash
# batch_exec.sh
hosts=("192.168.1.10" "192.168.1.11")
sql="SELECT VERSION();"
for h in "${hosts[@]}"; do
echo "=== $h ==="
./mysql_adv.exp "$h" "monitor" "MonPass2024" "$sql"
done
set pass $env(MYSQL_PASS)。set pass [exec openssl enc -d -aes-256-cbc -in pass.enc -k $KEY]。mysql_config_editor print --login-path=prod 驗證 .mylogin.cnf(更推薦)。chmod 700,僅擁有者可讀寫執行。| 命令 | 說明 | ||
|---|---|---|---|
spawn cmd | 啟動子程序,建立 PTY | ||
expect "pattern" | 等待輸出匹配模式 | ||
send "string\r" | 發送字串(含 Enter) | ||
interact | 轉為人工互動模式 | ||
exp_continue | 匹配後繼續等待下一個 pattern | ||
timeout | 全域逾時秒數 (預設 10) |
| 方案 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|
| Expect | 通用、支援複雜互動、無需修改 MySQL 設定 | 明文密碼風險、較慢 | 舊版 MySQL、多因子提示、跨平台 |
| mysql_config_editor | 加密儲存、官方工具、無明文 | 需 5.6.6+、僅支援單一登入路徑 | 常規自動化、備份腳本 |
| .my.cnf [client] password | 簡單 | 明文、權限嚴格 (600) | 測試環境、單用戶 |
| MYSQL_PWD 環境變數 | 無檔案殘留 | 進程列表可見 (ps aux)、已棄用警告 | 容器化、CI/CD 暫時用 |