我正在尝试设置一个 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
...进一步阅读:
更新:要转义密码中的
'
单引号或"
双引号,您可以使用前导反斜杠转义它们,或者如果没有其他字符与所选的引用样式不兼容,则可以将整个参数括在相反样式的引号中和。如果您还有单引号和其他特殊字符,那么您会遇到反斜杠转义,因为在 unix 中,双引号比单引号“弱”,并且当用双引号而不是单引号括起来时,许多元字符仍然会扩展引号。
这不是 MySQL 特有的,但适用于任何带有命令行参数的东西。
您通常可以使用该
echo
命令来查看 shell 如何解释您的参数。后续行动:bash shell(可能还有其他一些)允许在单引号字符串中转义单引号,尽管约定很奇怪(可能是基于一些早已被遗忘的决定,现在迷失在时间的迷雾中):
'
将字符串中的每个替换为'\''
before 将整个字符串用单引号括起来......所以文字字符串foo'bar
表示为'foo'\''bar'
.就像我说的,很奇怪。这是必需的,因为反斜杠在单引号字符串之外转义单引号,反斜杠在 bash 中的单引号字符串内不转义任何内容,并且只要没有未转义的单引号字符串,可以通过多个单引号关闭和重新打开单引号字符串具有特殊含义的中间字符。所以
'\''
关闭字符串的引用,然后提供转义的文字,然后重新打开字符串的引用。添加:
在 Windows 机器上,我们也遇到了密码:它包含
%
需要转义的密码%%
(此处仅引用是不够的)