web-dev-qa-db-fra.com

Mot de passe de script shell avec des caractères spéciaux

J'ai construit un script de sauvegarde Shell mysql qui fonctionne très bien.

Il a seulement des problèmes avec les mots de passe avec des caractères spéciaux comme celui-ci: xgT{uic[Is?uJ+.

Voici la partie importante du script:

#!/bin/sh
FILE=mysql-$db.$DATE.sql.gz
ssh $SUSER@$SHOST "mysqldump -q -u $MUSER -h $MHOST -p$MPASS $db --no-create-db | gzip -9 > $FILE" 2> $ERROR

Je l'ai changé pour:

ssh $SUSER@$SHOST 'mysqldump -q -u $MUSER -h $MHOST -p'\''$MPASS'\'' $db --no-create-db | gzip -9 > $FILE' 2> $ERROR

Comme vous pouvez le constater, j'ai déjà essayé les guillemets doubles. Mais maintenant je reçois l'erreur:

bash: $FILE: ambiguous redirect

Je reçois le mot de passe et d'autres informations d'un fichier externe:

DB_Host=000.000.000.000
DB_DATABASE=dbdame
DB_USER=db user
DB_PASS="xgT{uic[Is?uJ+"

Dans mon script, prenez les informations du fichier externe:

Source dbserver.conf
MUSER=$DB_USER
MPASS=$DB_PASS
MHOST=$DB_Host
DBS=$DB_DATABASE
3
HHGK

Votre mot de passe doit avoir les caractères spéciaux échappés. Donc, si votre mot de passe d'origine est xgT{uic[Is?uJ+, il devra devenir xgT\{uic\[Is\?uJ\+ (barre oblique avant les caractères spéciaux).

Vous voudrez peut-être aussi regarder quelque chose déjà écrit pour faire cela, tel que AutoMySQLBackup , mais je ne suis pas sûr d'avoir besoin de rotations de sauvegarde quotidiennes, hebdomadaires ou mensuelles. Cependant, la même règle s'applique, si le mot de passe comporte des caractères spéciaux, ces caractères spéciaux doivent être ignorés.

J'espère que ça t'as aidé!

1
octoquad

Oui. Cela a aidé à échapper aux caractères spéciaux:

MPASS=$(printf "%q\n" "$DB_PASS")

Mais il y avait toujours un problème avec mysqldump. J'ai finalement découvert que mysqldump ne fonctionnait que pour moi avec des mots de passe avec des caractères spéciaux lorsque je ne dis pas à mysqldump l'hôte (-h nomhôte). Cela semble être un bug. Ou n'est ce pas?

Malheureusement, j'ai aussi des sites où le serveur mysql est un autre hôte. Donc, cette solution n'est pas parfaite.

1
HHGK

Vous devriez écrire comme ceci:

ssh "$SUSER@$SHOST" "mysqldump -q -u \"$MUSER\" -h \"$MHOST\" -p\"$MPASS\" \"$db\" --no-create-db | gzip -9 > \"$FILE\"" 2> "$ERROR"

Autrement dit, toutes les variables utilisées comme arguments de ligne de commande doivent être protégées en les mettant entre guillemets. Les doubles guillemets autour des variables garantissent que l'expression est traitée comme une valeur unique. Le shell ne la scinde pas en mots. Notez que " intégré à "..." doit être échappé et écrit en tant que \". Une solution plus simple consiste à utiliser des guillemets simples à la place des guillemets incorporés, comme ceci:

ssh "$SUSER@$SHOST" "mysqldump -q -u '$MUSER' -h '$MHOST' -p'$MPASS' '$db' --no-create-db | gzip -9 > '$FILE'" 2> "$ERROR"

Enfin, je me demandais si vous vouliez vraiment avoir 2> "$ERROR" sur l'hôte local et non sur l'hôte distant. J'imagine que vous souhaitiez réellement cela sur l'hôte distant. Il s'agit donc d'une autre erreur dans la ligne de commande d'origine. Si c'est le cas, alors voici le correctif:

ssh "$SUSER@$SHOST" "mysqldump -q -u '$MUSER' -h '$MHOST' -p'$MPASS' '$db' --no-create-db | gzip -9 > '$FILE' 2> '$ERROR'"
0
janos