Script Bash e caracteres especiais em senha

7

Eu tenho lido muitas perguntas já feitas aqui, no entanto, de alguma forma, nada está funcionando para mim. Eu tenho um script bash onde eu tenho que enviar a senha que despejar o banco de dados na máquina remota, então é como:

!/bin/sh
/usr/bin/ssh -p 91899 user@remoteHost mysqldump -u db_user -p#8111*@uu( my_database |  gzip -c >  my_database.sql.gz

Agora, a senha tem todos os tipos de caracteres especiais: #8111*@uu(

Se eu executar o comando acima diretamente usando a senha dentro de aspas simples, ele funcionará: ie.

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

Sem aspas simples, recebo um erro para o '(' no final.

Eu também tentei escapar caracteres em senha assim:

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

Em seguida, dá acesso negado erro.

Eu também tentei usar "source" ie. salvar senha em outro arquivo como:

Arquivo pass.cre

MYPASSWORD='#8111*@uu('

Em seguida, incluir esse arquivo no script 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

Parece estar lendo $ MYPASSWORD do arquivo, em seguida, novamente erro de caractere inválido.

Algum conselho sobre o que estou perdendo?

    
por Saahib 03.07.2015 / 17:31

2 respostas

7

Use aspas duplas duas vezes, com escape e sem escape: -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'

Ou outra versão

/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"

Exemplos

% 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.
    
por A.B. 03.07.2015 / 17:48
2

O problema é que sua string está sendo interpretada duas vezes, uma vez pelo shell local e, novamente, pelo shell remoto que ssh está executando para você. Então você precisa citar duas vezes, usando um destes:

-p\''#8111*@uu('\'
-p"'#8111*@uu('"

Editar: Se você vai citar duas vezes o "" do comando inteiro, você terá problemas com senhas contendo $ . Você precisa citar o comando para evitar isso. Mas você ainda precisa citar o valor -p como é interpretado duas vezes. Então você precisa de aspas simples entre aspas simples.

Isso é feito usando uma citação simples entre aspas ( \' ) como neste exemplo:

'I don'\''t like java'

fornecerá a string I don't like java . Então, o seu exemplo com aspas duplas se torna o simples citado:

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

Você não ama isso?

    
por meuh 03.07.2015 / 17:49