mysqladmin没有采取内联密码


10

我正在尝试设置一个cron作业,以便从从机上进行备份。所以我要停止奴隶

我发出命令

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

但这会引发错误:

mysqladmin:在“ localhost”处连接到服务器失败错误:“对用户“ root” @“ localhost”的访问被拒绝(使用密码:是)

现在我尝试使用命令

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

它提示输入密码,我给了as test_pass,一切都很好。

为什么会这样呢?有什么选择?

注意:顺便说一句,我的mysql版本是mysql-5.0.95-5,这有意义。


您的密码是否有shell可能解释的任何特殊字符?您是否尝试将密码放在“引号”或“引号”中?
Michael-sqlbot

shell可能会解释哪些特殊字符?有文件吗?
Praveen Prasannan

1
$&!之类的字符 \ [] <>都被认为是潜在的问题。用'单引号引起来的密码应该可以避免该问题。gnu.org/software/bash/manual/bashref.html#Quinging
Michael-sqlbot

2
很棒..工作。我想将此标记为答案。你能回答这个问题吗?
Praveen Prasannan

@ Michael-sqlbot是的,您应该发布此答案
RolandoMySQLDBA

Answers:


21

命令行自变量受系统命令外壳的解释,在传递给调用程序之前,请更改命令的行为或更改自变量的值。

当参数(例如的值--password)包含外壳程序可能会解释的字符时,则需要将其加引号(通常'在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

进一步阅读:


更新:要对密码中的'"引号或双引号进行转义,可以用引号反斜杠将其转义,或者如果没有其他字符与所选引号风格不兼容,则可以将整个参数用相反的引号引起来用。

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 shell(可能还有其他一些)允许在单引号引起来的字符串中转义单引号,尽管约定很奇怪(可能是基于一些早已被人们遗忘的决定,但现在却被时间迷惑了):

将整个字符串替换为单引号之前,用替换'字符串内部的每个字符串,'\''以便将文字字符串foo'bar表示为'foo'\''bar'

就像我说的那样,离奇。这是必要的,因为一个反斜杠一个单引号字符的单引号外,一个反斜杠没有在bash单引号字符串中,单引号的字符串可以由多个单引号,只要没有转义关闭并重新打开具有特殊含义的中间字符。因此,'\''关闭字符串的引用,然后提供转义的文字,然后重新打开字符串的引用。


1
需要更多说明。如果密码字段中出现单引号('),该怎么办?用slash()转义是唯一的方法吗?
Praveen Prasannan

我的活动服务器的密码设置为偶发事件pa$$word
Umair

0

加成:

在Windows机器上,我们也%尝试使用密码:它包含需要转义的密码%%(此处仅行情还不够)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.