Script bash et caractères spéciaux d'échappement dans le mot de passe

10

J'ai lu beaucoup de questions déjà posées ici, cependant, en quelque sorte, rien ne fonctionne pour moi. J'ai un script bash où je dois envoyer un mot de passe qui sauvegarde la base de données sur la machine distante, donc c'est comme:

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

Maintenant, la chose est que ce mot de passe a toutes sortes de caractères spéciaux: #8111*@uu(

Si je lance la commande ci-dessus directement en utilisant un mot de passe entre guillemets simples, alors cela fonctionne: ie.

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

Sans guillemets simples, j'obtiens une erreur avec le '(' à la fin.

J'ai également essayé d'échapper des caractères dans le mot de passe comme ceci:

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

Ensuite, il donne une erreur d'accès refusé.

J'ai aussi essayé d'utiliser "source" ie. enregistrer le mot de passe dans un autre fichier sous:

Fichier pass.cre

MYPASSWORD='#8111*@uu('

Puis en incluant ce fichier dans le 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

Il semble lire $ MYPASSWORD à partir du fichier, puis à nouveau une erreur de caractère non valide.

Un conseil ce qui me manque?

Saahib
la source

Réponses:

8

Utilisez des guillemets doubles deux fois, échappés et non échappés: -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 une autre version

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

Exemples

% 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.
UN B
la source
Merci @meuh et AB, cela a certainement du sens et je l'ai testé, son fonctionnement. Merci les gars de m'avoir indiqué la bonne direction.
Saahib
Il semble y avoir un petit problème, j'ai un mot de passe comme celui-ci: io#bc@14@9$#jf7AZlk99 Pour la télécommande, cela ne fonctionne pas. /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" J'ai essayé de m'échapper comme suggéré ici ie. en gardant à l'esprit qu'il a été exécuté deux fois, mais je pense que lors de l'envoi d'une commande via SSH à un serveur distant, les choses semblent avoir peu changé.
Saahib
Utilisation/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 voit ma modification de ma réponse car vous avez un problème $#et avez besoin de guillemets simples tout au long.
meuh
3

Le problème est que votre chaîne est interprétée deux fois, une fois par le shell local et de nouveau par le shell distant qui sshs'exécute pour vous. Vous devez donc citer deux fois, en utilisant l'un des deux:

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

Edit: Si vous allez citer deux fois ""la commande entière, vous aurez des problèmes avec les mots de passe contenant $. Vous devez utiliser un guillemet simple pour éviter cela. Mais vous devez toujours mettre un guillemet simple -pcomme il est interprété deux fois. Vous avez donc besoin de guillemets simples à l'intérieur de guillemets simples.

Cela se fait en utilisant un guillemet simple ( \') comme dans cet exemple:

'I don'\''t like java'

vous donnera la chaîne I don't like java. Ainsi, votre exemple entre guillemets devient le guillemet simple:

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

Tu ne l'aimes pas?

meuh
la source