mysqladmin 不採用內聯密碼
我正在嘗試設置一個 cron 作業來從我的從機上進行備份。所以我需要阻止奴隸
我發出命令
mysqladmin --user=root --password=test_pass stop-slave
但它拋出錯誤:
mysqladmin:連接到“localhost”的伺服器失敗錯誤:“使用者’root’@’localhost’的訪問被拒絕(使用密碼:是)'
現在我嘗試使用命令
mysqladmin --user=root --password stop-slave
它提示輸入密碼,我給了
test_pass
,一切都很好。為什麼會這樣?什麼是替代方案?
注意:順便說一句,我的 mysql 版本是
mysql-5.0.95-5
,這很有意義。
命令行參數受系統命令外殼的解釋,改變命令的行為或改變參數的值,然後再將它們傳遞給被呼叫的程序。
當參數(例如 的值
--password
)包含 shell 可能解釋的字元時,它們需要被引用(通常'
在 unix中用單引號括起來,"
在 Windows 中用雙引號括起來)或單獨轉義(通常\
在每個元字元之前使用反斜杠) ) 以避免由 shell 解釋。雖然特定字元是系統特定的,但需要注意的一些字元包括:
$ & ! \ [ ] < > `
如果密碼(舉一個非常糟糕的例子)設置為
pa$$word
…mysql --password=pa$$word # does not work mysql --password='pa$$word' # works mysql --password=pa\$\$word # works, but slightly unclear what's going on at first glance
進一步閱讀:
- http://www.gnu.org/software/bash/manual/bashref.html#Quoting
- http://www.sal.ksu.edu/faculty/tim/unix_sg/shell/metachar.html
- http://www.grymoire.com/Unix/Quote.html
更新:要轉義密碼中的
'
單引號或"
雙引號,您可以使用前導反斜杠轉義它們,或者如果沒有其他字元與所選的引用樣式不兼容,則可以將整個參數括在相反樣式的引號中和。mysql --password="like'this" # password has a single quote in the middle mysql --password='like"this' # password with a double quote in the middle
如果您還有單引號和其他特殊字元,那麼您會遇到反斜杠轉義,因為在 unix 中,雙引號比單引號“弱”,並且當用雙引號而不是單引號括起來時,許多元字元仍然會擴展引號。
這不是 MySQL 特有的,但適用於任何帶有命令行參數的東西。
您通常可以使用該
echo
命令來查看 shell 如何解釋您的參數。$ echo foo$bar foo # literal 'foo' plus the (empty) shell variable $bar $ echo foo\$bar foo$bar # backslash prevents expansion of $bar as a variable $ echo "foo$$bar" # weaker double quote doesn't prevent expansion so foo9691bar # the $$ expands to the unix process id (pid) of the current shell $ echo 'foo$$bar' foo$$bar # "stronger" single quote prevents shell expansion $ echo "foo'bar" foo'bar # double quote allows single quote within the literal
後續行動:bash shell(可能還有其他一些)允許在單引號字元串中轉義單引號,儘管約定很奇怪(可能是基於一些早已被遺忘的決定,現在迷失在時間的迷霧中):
'
將字元串中的每個替換為'\''
before 將整個字元串用單引號括起來……所以文字字元串foo'bar
表示為'foo'\''bar'
.就像我說的,很奇怪。這是必需的,因為反斜杠在單引號字元串之外轉義單引號,反斜杠在 bash 中的單引號字元串內不轉義任何內容,並且只要沒有未轉義的單引號字元串,可以通過多個單引號關閉和重新打開單引號字元串具有特殊含義的中間字元。所以
'\''
關閉字元串的引用,然後提供轉義的文字,然後重新打開字元串的引用。