Bash 脚本和转义密码中的特殊字符

Bash 脚本和转义密码中的特殊字符

我已经阅读了很多已经在这里提出的问题,但是不知何故,对我来说没有任何效果。我有一个 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'

你不喜欢它吗?

相关内容