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


10

スレーブマシンからバックアップを取るための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。それは意味があります。


パスワードに、シェルが解釈する可能性のある特殊文字はありますか?パスワードを「引用符」または「引用符」で囲むことを試みましたか?
マイケル-sqlbot 2013

シェルが解釈する可能性がある特殊文字はどれですか?ドキュメントはありますか?
Praveen Prasannan 2013

1
$&!のような文字 \ [] <>はすべて潜在的に問題があると考えられます。パスワードを'一重引用符で囲むと、その問題を防ぐことができます。gnu.org/software/bash/manual/bashref.html#Quoting
Michael-sqlbot

2
素晴らしい。これを回答としてマークしたいと思います。答えとしてお答えください
Praveen Prasannan 2013

@ Michael-sqlbotはい、あなたが投稿する必要があります答えです
RolandoMySQLDBA

回答:


21

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

引数(の値など--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

参考文献:


更新:パスワードで'"重引用符または二重引用符をエスケープするには、先頭の円記号でエスケープするか、選択した引用スタイルに互換性のない他の文字がない場合は、引数全体を反対の引用スタイルで囲みます。と。

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内の単一引用符付き文字列の内側では何もエスケープしないため、これが必要です。特別な意味を持つ介在する文字。したがって'\''、文字列の引用符を閉じ、エスケープされたリテラルを提供してから、文字列の引用符を再び開きます。


1
もう少し説明が必要です。パスワードフィールドに単一引用符( ')が含まれている場合はどうなりますか?slash()でエスケープするのが唯一の方法ですか?
Praveen Prasannan 2013

私のライブサーバーのパスワードが設定されているというpa$$word
偶然の一致

0

添加:

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.