Pra*_*nan 10 mysql authentication mysqladmin
我正在尝试设置一个 cron 作业来从我的从机中获取备份。所以我需要阻止奴隶
我发出命令
mysqladmin --user=root --password=test_pass stop-slave
Run Code Online (Sandbox Code Playgroud)
但它抛出错误:
mysqladmin: 在 'localhost' 连接到服务器失败错误:'访问被拒绝用户 'root'@'localhost'(使用密码:YES)'
现在我尝试使用命令
mysqladmin --user=root --password stop-slave
Run Code Online (Sandbox Code Playgroud)
它提示输入密码,我给了test_pass
,一切都很好。
为什么会这样?什么是替代方案?
注意:顺便说一句,我的 mysql 版本是mysql-5.0.95-5
,它有任何意义。
Mic*_*bot 21
命令行参数受系统命令外壳的解释,在它们被传递到被调用程序之前改变命令的行为或改变参数的值。
当参数(例如 的值--password
)包含 shell 可以解释的字符时,它们需要被引用('
在 unix 中通常用单引号括起来或"
在 Windows 中用双引号括起来)或单独转义(通常\
在每个元字符前加一个反斜杠)) 以避免被 shell 解释。
虽然特定字符是特定于系统的,但需要注意的一些字符包括:
$ & ! \ [ ] < > `
Run Code Online (Sandbox Code Playgroud)
如果密码,对于一个非常糟糕的例子,被设置为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
Run Code Online (Sandbox Code Playgroud)
进一步阅读:
更新:要转义密码中的'
单"
引号或双引号,您可以使用前导反斜杠对它们进行转义,或者如果没有其他与所选引用样式不兼容的字符,则将整个参数括在相反的引号样式中和。
mysql --password="like'this" # password has a single quote in the middle
mysql --password='like"this' # password with a double quote in the middle
Run Code Online (Sandbox Code Playgroud)
如果您还有单引号和其他特殊字符,则您会遇到反斜杠转义问题,因为在 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
Run Code Online (Sandbox Code Playgroud)
后续:bash shell(可能还有其他一些shell)允许在单引号字符串中转义单引号,尽管约定很奇怪(可能基于一些早已被遗忘的决定,现在已被时间迷雾所迷惑):
替换每个'
与字符串内'\''
包装用单引号将整个字符串之前...所以文本字符串foo'bar
表示为'foo'\''bar'
。
就像我说的,很奇怪。这是必需的,因为反斜杠在单引号字符串之外转义单引号,反斜杠在 bash 中的单引号字符串内不转义任何内容,并且单引号字符串可以通过多个单引号关闭和重新打开,只要没有未转义具有特殊含义的中间字符。所以'\''
关闭字符串的引用,然后提供转义的文字,然后重新打开字符串的引用。
归档时间: |
|
查看次数: |
18062 次 |
最近记录: |