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

MySQL 密碼中驚嘆號 (!) 特殊字符的 Shell 轉義陷阱與應對

     編輯:MySQL 資料庫相關知識

問題現場

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&, 作為命令。

GUI 工具

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\( \) 或引號

最佳實踐建議

  1. ✅ **生產環境密碼禁用特殊字符**(僅字母數字 + _ -),源頭規避
  2. ✅ 客戶端連接**統一使用配置文件** ~/.my.cnf(權限 600)
  3. ✅ 腳本中密碼**單引號包裹**或**環境變量注入**
  4. ✅ 文檔化密碼策略,納入安全審計清單

驗證技巧

# 測試密碼字符串在 Shell 中的實際解析結果
echo 'fd52!wubx&,'    # 單引號:原樣輸出
echo "fd52!wubx&,"    # 雙引號:! 可能觸發歷史擴展
echo fd52!wubx&,     # 無引號:! 歷史擴展、& 後台執行
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved