Bash script y caracteres especiales de escape en la contraseña

10

He estado leyendo muchas preguntas ya formuladas aquí, sin embargo, de alguna manera, nada funciona para mí. Tengo un script bash donde tengo que enviar una contraseña que volca la base de datos en una máquina remota, por lo que es así:

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

Ahora lo que pasa es que esta contraseña tiene todo tipo de caracteres especiales: #8111*@uu(

Si ejecuto el comando anterior directamente en deberá usar la contraseña dentro de comillas simples, entonces funciona: es decir.

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

Sin comillas simples me sale un error con el '(' al final.

También traté de escapar de caracteres en contraseña como esta:

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

Luego da acceso denegado error.

También traté de usar "fuente", es decir. guardar contraseña en otro archivo como:

Archivo pass.cre

MYPASSWORD='#8111*@uu('

Luego, incluya ese archivo en el 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 leyendo $ MYPASSWORD del archivo y luego nuevamente error de carácter no válido.

¿Algún consejo de lo que me estoy perdiendo?

Saahib
fuente

Respuestas:

8

Use comillas dobles dos veces, escapado y no escapado: -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'

U otra versión

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

Ejemplos

% 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
fuente
Gracias @meuh y AB, ciertamente tiene sentido y lo he probado, está funcionando. Gracias a todos por señalarme en la dirección correcta.
Saahib
Parece que hay un pequeño problema, tengo una contraseña como esta: io#bc@14@9$#jf7AZlk99 para el control remoto, no funciona, es decir. /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" Traté de escapar como se sugiere aquí, es decir. Teniendo en cuenta que se ha ejecutado dos veces, pero creo que al enviar comandos a través de SSH al servidor remoto, las cosas parecen haber cambiado poco.
Saahib
Uso/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 ve mi edición de mi respuesta ya que tienes un problema $#y necesitas comillas simples en todo momento.
meuh
3

El problema es que su cadena está siendo interpretada dos veces, una por el shell local y otra vez por el shell remoto que se sshestá ejecutando para usted. Entonces necesita citar dos veces, usando cualquiera de estos:

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

Editar: si va a comillas dobles ""todo el comando, tendrá problemas con las contraseñas que contienen $. Necesita comillas simples para evitar esto. Pero aún necesita comillas simples el -pvalor, ya que se interpreta dos veces. Entonces necesita comillas simples dentro de comillas simples.

Esto se hace mediante el uso de una cita simple ( \') como en este ejemplo:

'I don'\''t like java'

te dará la cuerda I don't like java. Entonces, su ejemplo de comillas dobles se convierte en comillas 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'

¿No te encanta?

meuh
fuente