web-dev-qa-db-ja.com

mysqladminがインラインパスワードを取得しない

スレーブマシンからバックアップを取るためのcronジョブを設定しようとしています。だから私はスレーブを停止する必要があります

コマンドを発行しました

mysqladmin --user=root --password=test_pass stop-slave

しかし、それはエラーを投げています:

mysqladmin: 'localhost'でサーバーに接続できませんでしたエラー: 'ユーザー' root '@' localhost 'のアクセスが拒否されました(パスワードを使用:YES)'

今、私はコマンドで試しました

mysqladmin --user=root --password stop-slave

パスワードの入力を求め、test_passとすべてが大丈夫だった。

なぜそうなったのですか?代替は何ですか?

注意:ところで私のmysqlのバージョンはmysql-5.0.95-5、それは意味があります。

10

コマンドライン引数は、システムのコマンドシェルによる解釈の対象となり、呼び出されたプログラムに渡される前に、コマンドの動作を変更するか、引数の値を変更します。

引数(--passwordの値など)にシェルが解釈する可能性のある文字が含まれている場合、それらを引用符で囲む(通常、UNIXでは一重引用符'で、Windowsでは二重引用符"で囲む)か、個別にエスケープする(通常はバックスラッシュを使用)シェルによる解釈を避けるために、各メタ文字の前に\を追加します)。

特定の文字はシステム固有ですが、注意が必要な文字には次のものがあります。

$ & ! \ [ ] < > `

本当に悪い例として、パスワードが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

参考文献:


更新:パスワードで'の単一引用符または"の二重引用符をエスケープするには、先頭のバックスラッシュでエスケープするか、選択した引用符スタイル以外の文字がない場合は引数全体を反対の引用符スタイルで囲むことができます。 tと互換性があります。

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コマンドを使用して、シェルが引数をどのように解釈しているかを確認できます。

$ 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シェル(およびおそらく他のいくつか)では、一重引用符で囲まれた文字列内で一重引用符をエスケープできますが、慣例は奇妙です(おそらく、長い間忘れられていた決定が時間の霧の中で失われたためです)。

文字列全体を単一引用符で囲む前に、文字列内の各''\''で置き換えます。そのため、リテラル文字列foo'bar'foo'\''bar'として表されます。

私が言ったように、奇妙です。バックスラッシュは、単一引用符で囲まれた文字列の外で単一引用符をエスケープするため、これが必要です。バックスラッシュは、bashの単一引用符で囲まれた文字列内でnothingをエスケープし、単一引用符で囲まれた文字列は、特別な意味を持つエスケープされていない介在文字がない限り、複数の単一引用符で閉じて再度開くことができます。したがって、'\''は文字列の引用を閉じ、エスケープされたリテラルを提供してから、文字列の引用を再び開きます。

21

添加:

Windowsマシンでは、パスワードにも苦労しました。パスワードには%エスケープする必要がある%%(ここでは引用だけでは十分ではありません)

0
dognose