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

Saa*_*hib 14 bash scripts password

我一直在阅读这里已经提出的很多问题,但是,不知何故,没有什么对我有用。我有一个 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
Run Code Online (Sandbox Code Playgroud)

现在事情是这个密码有各种特殊字符: #8111*@uu(

如果我直接在应使用单引号内的密码运行上面的命令,那么它就可以工作:即。

/usr/bin/ssh -p 91899 user@remoteHost mysqldump -u db_user -p'#8111*@uu(' my_database |  gzip -c >  my_database.sql.gz
Run Code Online (Sandbox Code Playgroud)

如果没有单引号,我会在结尾处出现 '(' 错误。

我还尝试像这样转义密码中的字符:

!/bin/sh
/usr/bin/ssh -p 91899 user@remoteHost mysqldump -u db_user -p'\#8111\*\@uu(' my_database |  gzip -c >  my_database.sql.gz
Run Code Online (Sandbox Code Playgroud)

然后它给出访问被拒绝的错误。

我也尝试使用“源”即。将密码保存在另一个文件中:

文件pass.cre

MYPASSWORD='#8111*@uu('
Run Code Online (Sandbox Code Playgroud)

然后将该文件包含在 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
Run Code Online (Sandbox Code Playgroud)

它似乎是从文件中读取 $MYPASSWORD 然后又是无效字符错误。

我缺少什么建议?

A.B*_*.B. 13

使用双引号两次,转义和不转义: -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'
Run Code Online (Sandbox Code Playgroud)

或者其他版本

/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"
Run Code Online (Sandbox Code Playgroud)

例子

% 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.
Run Code Online (Sandbox Code Playgroud)


meu*_*euh 5

问题是您的字符串被解释两次,一次由本地 shell 解释,另一次由ssh为您运行的远程 shell 解释。因此,您需要使用以下任一方法引用两次:

-p\''#8111*@uu('\'
-p"'#8111*@uu('"
Run Code Online (Sandbox Code Playgroud)

编辑: 如果您要双引号""整个命令,则包含$. 您需要单引号该命令以避免这种情况。但您仍然需要单引号该-p值,因为它会被解释两次。因此,您需要在单引号内添加单引号。

这是通过使用单引号( \') 来完成的,如本例所示:

'I don'\''t like java'
Run Code Online (Sandbox Code Playgroud)

会给你字符串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'
Run Code Online (Sandbox Code Playgroud)

你不就是喜欢它吗?