Ich habe ein Shell-MySQL-Backup-Skript erstellt, das sehr gut funktioniert.
Probleme gibt es nur bei Passwörtern mit Sonderzeichen wie diesem:
xgT{uic[Is?uJ+
.
Hier ist der wichtige Teil des Skripts:
#!/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
Ich habe es wie folgt geändert:
ssh $SUSER@$SHOST 'mysqldump -q -u $MUSER -h $MHOST -p'\''$MPASS'\'' $db --no-create-db | gzip -9 > $FILE' 2> $ERROR
Wie Sie sehen, habe ich bereits Anführungszeichen ausprobiert. Aber jetzt erhalte ich den Fehler:
bash: $FILE: ambiguous redirect
Ich erhalte das Passwort und andere Informationen aus einer externen Datei:
DB_HOST=000.000.000.000
DB_DATABASE=dbdame
DB_USER=db user
DB_PASS="xgT{uic[Is?uJ+"
In meinem Skript werden die Informationen aus der externen Datei entnommen:
Source dbserver.conf
MUSER=$DB_USER
MPASS=$DB_PASS
MHOST=$DB_HOST
DBS=$DB_DATABASE
Antwort1
In Ihrem Passwort müssen die Sonderzeichen maskiert sein. Wenn Ihr ursprüngliches Passwort also lautet, xgT{uic[Is?uJ+
muss es lauten: xgT\{uic\[Is\?uJ\+
(Ein Schrägstrich vor den Sonderzeichen).
Vielleicht möchten Sie sich auch etwas ansehen, das bereits zu diesem Zweck geschrieben wurde, wie zum BeispielAutoMySQLBackup, aber ich bin nicht sicher, ob Sie tägliche, wöchentliche oder monatliche Backup-Rotationen benötigen. Es gilt jedoch die gleiche Regel: Wenn das Passwort Sonderzeichen enthält, müssen diese Sonderzeichen maskiert werden.
Hoffentlich hilft das!
Antwort2
Ja. Es hat geholfen, Sonderzeichen zu vermeiden:
MPASS=$(printf "%q\n" "$DB_PASS")
Aber es gab immer noch ein Problem mit mysqldump. Ich habe schließlich herausgefunden, dass mysqldump bei mir nur mit Passwörtern mit Sonderzeichen funktionierte, wenn ich mysqldump den Host nicht mitteile (-h Hostname). Das scheint ein Fehler zu sein. Oder ist es das nicht?
Leider habe ich auch Sites, bei denen der MySQL-Server ein anderer Host ist. Daher ist diese Lösung nicht perfekt.
Antwort3
Sie sollten folgendermaßen schreiben:
ssh "$SUSER@$SHOST" "mysqldump -q -u \"$MUSER\" -h \"$MHOST\" -p\"$MPASS\" \"$db\" --no-create-db | gzip -9 > \"$FILE\"" 2> "$ERROR"
Das heißt, alle Variablen, die als Befehlszeilenargumente verwendet werden, sollten durch Anführungszeichen geschützt werden. Die doppelten Anführungszeichen um Variablen stellen sicher, dass der Ausdruck als einzelner Wert behandelt wird, sodass die Shell ihn nicht in Wörter aufspaltet. Beachten Sie, dass "
eingebettete innerhalb "..."
maskiert und als geschrieben werden müssen \"
. Eine einfachere Lösung besteht darin, einfache Anführungszeichen anstelle der eingebetteten doppelten Anführungszeichen zu verwenden, wie folgt:
ssh "$SUSER@$SHOST" "mysqldump -q -u '$MUSER' -h '$MHOST' -p'$MPASS' '$db' --no-create-db | gzip -9 > '$FILE'" 2> "$ERROR"
Zuletzt frage ich mich, ob Sie es wirklich 2> "$ERROR"
auf dem lokalen Host und nicht auf dem Remote-Host haben wollten. Ich vermute, Sie wollten es tatsächlich auf dem Remote-Host, also ist das ein weiterer Fehler in der ursprünglichen Befehlszeile. Wenn das der Fall ist, dann ist hier die Lösung:
ssh "$SUSER@$SHOST" "mysqldump -q -u '$MUSER' -h '$MHOST' -p'$MPASS' '$db' --no-create-db | gzip -9 > '$FILE' 2> '$ERROR'"