web-dev-qa-db-fra.com

Script Bash et échappant des caractères spéciaux dans le mot de passe

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 le mot de passe qui dump 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

Le problème, c’est que ce mot de passe a toutes sortes de caractères spéciaux: #8111*@uu(

Si je lance la commande ci-dessus directement dans shall en utilisant un mot de passe entre guillemets simples, 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, je reçois une erreur avec pour le '(' à la fin.

J'ai aussi essayé d'échapper aux caractères du 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" c'est-à-dire. enregistrer le mot de passe dans un autre fichier en tant que:

Fichier pass.cre

MYPASSWORD='#8111*@uu('

Incluant ensuite 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 depuis un fichier, puis encore une erreur de caractère invalide.

Un conseil qui me manque?

8
Saahib

Utilisez des guillemets doubles deux fois, avec et sans échappé: -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.
7
A.B.

Le problème est que votre chaîne est interprétée deux fois, une fois par le shell local et une autre fois par le shell distant sur lequel ssh est en cours d'exécution pour vous. Vous devez donc citer deux fois, en utilisant l’une de ces méthodes:

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

Edit: Si vous double-citez "" dans toute la commande, vous aurez des problèmes avec les mots de passe contenant $. Pour éviter cela, vous devez utiliser une simple citation de la commande. Mais vous devez toujours citer entre guillemets la valeur -p car elle est interprétée deux fois. Vous avez donc besoin de guillemets simples entre guillemets simples.

Pour ce faire, utilisez 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 n'aimes pas ça?

2
meuh