Script Bash e caracteres especiais de escape na senha

10

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 senha que despejar 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 coisa é que essa senha tem todos os tipos de caracteres especiais: #8111*@uu(

Se eu executar o comando acima diretamente no deve usar a senha entre aspas simples, então funciona: 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 com o '(' no final.

Eu também tentei escapar caracteres na senha como este:

!/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, ele fornece erro de acesso negado.

Eu também tentei usar "fonte" ie. salvando a senha em outro arquivo como:

Arquivo pass.cre

MYPASSWORD='#8111*@uu('

Em seguida, incluindo 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 e, novamente, erro de caractere inválido.

Algum conselho do que estou perdendo?

Saahib
fonte

Respostas:

8

Use aspas duplas duas vezes, escapou e não escapou: -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.
AB
fonte
Obrigado @meuh e AB, certamente faz sentido e eu testei, está funcionando. Obrigado pessoal por me indicar a direção certa.
Saahib
Parece haver um pequeno problema, eu tenho uma senha assim: io#bc@14@9$#jf7AZlk99 Para controle remoto, ou seja, não está funcionando. /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" Eu tentei escapar como sugerido aqui ie. tendo em mente que ele foi executado duas vezes, mas acho que ao enviar o comando via SSH para o servidor remoto, as coisas parecem pouco mudadas.
Saahib 04/07/2015
Use/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 vê minha edição na minha resposta, pois você tem um problema $#e precisa de aspas simples.
Meu4 de
3

O problema é que sua string está sendo interpretada duas vezes, uma vez pelo shell local e novamente pelo shell remoto que sshestá sendo executado 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 comando inteiro, terá problemas com as senhas que contêm $. Você precisa aspas simples no comando para evitar isso. Mas você ainda precisa citar o -pvalor como ele é interpretado duas vezes. Então você precisa de aspas simples dentro de aspas simples.

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

'I don'\''t like java'

lhe dará a corda I don't like java. Portanto, seu exemplo de aspas duplas se torna o aspas simples:

/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ê simplesmente não ama?

meuh
fonte