我已经阅读了很多已经在这里提出的问题,但是不知何故,对我来说没有任何效果。我有一个 bash 脚本,我必须发送密码,该密码会在远程机器上转储数据库,因此它就像:
!/bin/sh
/usr/bin/ssh -p 91899 user@remoteHost mysqldump -u db_user -p#8111*@uu( my_database | gzip -c > my_database.sql.gz
现在的问题是,这个密码包含各种特殊字符:
#8111*@uu(
如果我直接在单引号中使用密码运行上述命令,那么它就可以起作用:即。
/usr/bin/ssh -p 91899 user@remoteHost mysqldump -u db_user -p'#8111*@uu(' my_database | gzip -c > my_database.sql.gz
如果没有单引号,我会因为末尾的‘(’而收到错误。
我还尝试过像这样转义密码中的字符:
!/bin/sh
/usr/bin/ssh -p 91899 user@remoteHost mysqldump -u db_user -p'\#8111\*\@uu(' my_database | gzip -c > my_database.sql.gz
然后它会出现访问被拒绝错误。
我也尝试使用“源”,即将密码保存在另一个文件中:
文件密码.cre
MYPASSWORD='#8111*@uu('
然后将该文件包含在 Bash 脚本中:
!/bin/sh
source pass.cre
/usr/bin/ssh -p 91899 user@remoteHost mysqldump -u db_user -p$MYPASSWORD my_database | gzip -c > my_database.sql.gz
它似乎正在从文件读取 $MYPASSWORD,然后再次出现无效字符错误。
对于我遗漏的内容有什么建议吗?
答案1
使用两次双引号,转义和未转义:-p"\"$MYPASSWORD\""
#!/bin/sh
source pass.cre
/usr/bin/ssh -p 91899 user@remoteHost 'mysqldump -u db_user -p"\"$MYPASSWORD\"" my_database | gzip -c > my_database.sql.gz'
或者其他版本
/usr/bin/ssh -p 91899 user@remoteHost "mysqldump -u db_user -p\"'io#bc@14@9$#jf7AZlk99'\" my_database | gzip -c > my_database.sql.gz"
例子
% source pass.cre
% ssh user@host mysqldump -u root -p$MYPASSWORD
user@host's password:
zsh:1: bad pattern: -p#8111*@uu(
% source pass.cre
% ssh user@host mysqldump -u root -p"$MYPASSWORD"
user@host's password:
zsh:1: bad pattern: -p#8111*@uu(
% source pass.cre
% ssh user@host mysqldump -u root -p"\"$MYPASSWORD\""
user@host's password:
Warning: Using a password on the command line interface can be insecure.
答案2
问题是你的字符串被解释两次,一次是由本地 shell 解释,另一次是由ssh
为你运行的远程 shell 解释。因此你需要引用两次,使用以下任一方式:
-p\''#8111*@uu('\'
-p"'#8111*@uu('"
编辑:
如果您要用双引号括住""
整个命令,则包含 的密码会遇到问题$
。您需要用单引号括住命令以避免这种情况。但您仍然需要用单引号括住值,-p
因为它会被解释两次。因此您需要在单引号内使用单引号。
这是通过使用单引号(\'
)如本例所示:
'I don'\''t like java'
将返回字符串I don't like java
。因此,双引号示例将变为单引号示例:
/usr/bin/ssh -p 91899 user@remoteHost 'mysqldump -u db_user -p'\''io#bc@14@9$#jf7AZlk99'\''my_database | gzip -c > my_database.sql.gz'
你不喜欢它吗?