首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

使用 Expect 實現 MySQL 免密碼互動式登入腳本

     編輯:MySQL 資料庫相關知識

自動化部署、備份腳本常需非互動式登入 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> 提示符。

進階版:參數化、支援多主機、執行 SQL 後離開

#!/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

搭配 Shell 迴圈批次執行

#!/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,僅擁有者可讀寫執行。

Expect 關鍵命令速查

替代方案比較

命令說明
spawn cmd啟動子程序,建立 PTY
expect "pattern"等待輸出匹配模式
send "string\r"發送字串(含 Enter)
interact轉為人工互動模式
exp_continue匹配後繼續等待下一個 pattern
timeout全域逾時秒數 (預設 10)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
方案優點缺點適用場景
Expect通用、支援複雜互動、無需修改 MySQL 設定明文密碼風險、較慢舊版 MySQL、多因子提示、跨平台
mysql_config_editor加密儲存、官方工具、無明文需 5.6.6+、僅支援單一登入路徑常規自動化、備份腳本
.my.cnf [client] password簡單明文、權限嚴格 (600)測試環境、單用戶
MYSQL_PWD 環境變數無檔案殘留進程列表可見 (ps aux)、已棄用警告容器化、CI/CD 暫時用