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


10

我一直在阅读这里已经问过的很多问题,但是,某种原因对我来说毫无用处。我有一个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

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

我也尝试使用“源”即。将密码另存为:

文件pass.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,然后再次出现无效字符错误。

有什么建议我想念的吗?

Answers:


8

使用双引号两次,转义和不转义: -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.

感谢@meuh和AB,这当然是有道理的,我已经对其进行了测试,可以正常工作。谢谢你们为我指出正确的方向。
Saahib

似乎有一个小问题,我有这样的密码:io#bc@14@9$#jf7AZlk99 对于远程,它不起作用,即。 /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" 我试图按照这里的建议逃跑,即。请记住,它已经执行了两次,但是我认为当通过SSH向远程服务器发送命令时,情况似乎没有什么变化。
萨希卜2015年

使用/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"
AB

@Rick_IRS可以查看我对答案的编辑,因为您有问题,$#并且始终需要单引号。
meuh 2015年

3

问题在于您的字符串被解释了两次,一次是由本地外壳程序解释,另一次是由ssh为您运行的远程外壳程序解释。因此,您需要使用以下两种方法之一进行两次报价:

-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'

你不只是喜欢它吗?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.