GRANT ALL ON wubx.* TO 'wubx'@'172.16.100.185' IDENTIFIED BY 'fd52!wubx&,';
# mysql -h 172.16.100.185 -u wubx -pfd52!wubx&, -bash: !wubx&,: event not found
原因:Bash 歷史擴展機制,! 觸發歷史命令替換,導致密碼被截斷並嘗試執行 wubx&, 作為命令。
Navicat 等圖形工具同樣可能因特殊字符解析錯誤導致連接失敗。
$link = mysql_connect('172.16.100.185', 'wubx', 'fd52!wubx&,');
// Connected successfully
PHP 驅動直接傳遞字符串,無 Shell 解析層,**不受影響**。
mysql -h host -u user -p'fd52!wubx&,'
單引號禁用所有 Shell 解釋(含變量、歷史擴展、命令替換)。
mysql -h host -u user -pfd52\!wubx&, # 或關閉歷史擴展 set +H mysql -h host -u user -pfd52!wubx&, set -H
# ~/.my.cnf [client] host=172.16.100.185 user=wubx password="fd52!wubx&,"
mysql --defaults-file=~/.my.cnf
| 字符 | Shell 意義 | 轉義寫法 | 備註 |
|---|---|---|---|
| ! | 歷史擴展 | \! 或單引號 | Bash 默認開啟 |
| $ | 變量引用 | \$ 或單引號 | |
| ` | 命令替換 | \` 或單引號 | |
| \ | 轉義符 | \\ | |
| " | 雙引號包裹 | \" | 雙引號內仍解析 $ ` \ |
| & | 後台執行 | \& 或引號 | |
| | | 管道 | \| 或引號 | |
| ; | 命令分隔 | \; 或引號 | |
| () | 子Shell | \( \) 或引號 |
~/.my.cnf(權限 600)# 測試密碼字符串在 Shell 中的實際解析結果 echo 'fd52!wubx&,' # 單引號:原樣輸出 echo "fd52!wubx&," # 雙引號:! 可能觸發歷史擴展 echo fd52!wubx&, # 無引號:! 歷史擴展、& 後台執行