Bash script e caratteri speciali di escape nella password


10

Ho letto molte domande già poste qui, tuttavia, in qualche modo nulla funziona per me. Ho uno script bash in cui devo inviare la password che scarica il database sul computer remoto, quindi è come:

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

Ora la cosa è che questa password ha ogni tipo di carattere speciale: #8111*@uu(

Se corro sopra il comando direttamente in deve usare la password tra virgolette singole, allora funziona: ie.

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

Senza virgolette singole ricevo un errore per "(" alla fine.

Ho anche cercato di sfuggire ai personaggi con password in questo modo:

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

Quindi dà accesso negato errore.

Ho anche provato a usare "source", cioè. salvare la password in un altro file come:

File pass.cre

MYPASSWORD='#8111*@uu('

Quindi includendo quel file nello 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

Sembra leggere $ MYPASSWORD dal file, quindi di nuovo un errore di carattere non valido.

Qualche consiglio su cosa mi sto perdendo?

Risposte:


8

Utilizza le virgolette doppie due volte, con escape e non con 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'

O un'altra versione

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

Esempi

% 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.

Grazie @meuh e AB, ha sicuramente senso e l'ho provato, funziona. Grazie ragazzi per avermi indicato la giusta direzione.
Saahib,

Sembra che ci sia un piccolo problema, ho una password come questa: io#bc@14@9$#jf7AZlk99 per il telecomando, non funziona cioè. /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" Ho provato a scappare come suggerito qui cioè. tenendo presente che è stato eseguito due volte ma penso che quando si invia il comando tramite SSH al server remoto, le cose sembrano essere leggermente cambiate.
Saahib,

Usa/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 il

@Rick_IRS vede la mia modifica alla mia risposta poiché hai un problema $#e hai bisogno di virgolette singole in tutto.
Meuh

3

Il problema è che la tua stringa viene interpretata due volte, una volta dalla shell locale e di nuovo dalla shell remota che sshè in esecuzione per te. Quindi è necessario citare due volte, utilizzando uno di questi:

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

Modifica: se hai intenzione di citare due volte ""l'intero comando, avrai problemi con le password che contengono $. È necessario citare una sola virgola per evitarlo. Ma devi ancora citare il -pvalore come viene interpretato due volte. Quindi hai bisogno di virgolette singole all'interno di virgolette singole.

Questo viene fatto usando una virgoletta singola ( \') come in questo esempio:

'I don'\''t like java'

ti darà la stringa I don't like java. Quindi il tuo esempio tra virgolette doppie diventa virgolette singola:

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

Non lo adori e basta?

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.