He creado un script de copia de seguridad de shell mysql que funciona muy bien.
Sólo tiene problemas con contraseñas con caracteres especiales como este:
xgT{uic[Is?uJ+
.
Aquí está la parte importante del guión:
#!/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
Lo he cambiado a:
ssh $SUSER@$SHOST 'mysqldump -q -u $MUSER -h $MHOST -p'\''$MPASS'\'' $db --no-create-db | gzip -9 > $FILE' 2> $ERROR
Como puede ver, ya probé con comillas dobles. Pero ahora me sale el error:
bash: $FILE: ambiguous redirect
Obtengo la contraseña y otra información de un archivo externo:
DB_HOST=000.000.000.000
DB_DATABASE=dbdame
DB_USER=db user
DB_PASS="xgT{uic[Is?uJ+"
Dentro de mi script toma la información del archivo externo:
Source dbserver.conf
MUSER=$DB_USER
MPASS=$DB_PASS
MHOST=$DB_HOST
DBS=$DB_DATABASE
Respuesta1
Su contraseña debe tener caracteres especiales en formato de escape. Entonces, si su contraseña original es, xgT{uic[Is?uJ+
tendrá que convertirse en xgT\{uic\[Is\?uJ\+
(una barra antes de los caracteres especiales).
También es posible que desees consultar algo ya escrito para hacer esto, comoCopia de seguridad automática de MySQL, pero no estoy seguro de si necesita rotaciones de respaldo diarias, semanales o mensuales. Sin embargo, se aplica la misma regla: si la contraseña tiene caracteres especiales, es necesario utilizar caracteres de escape.
¡Espero que ayude!
Respuesta2
Sí. Ayudó a escapar de caracteres especiales:
MPASS=$(printf "%q\n" "$DB_PASS")
Pero todavía había un problema con mysqldump. Finalmente descubrí que mysqldump solo funcionó para mí con contraseñas con caracteres especiales cuando no le digo a mysqldump el host (-h nombre de host). Esto parece ser un error. ¿O no lo es?
Lamentablemente también tengo sitios donde el servidor MySQL es otro host. Entonces esta solución no es perfecta.
Respuesta3
Deberías escribir así:
ssh "$SUSER@$SHOST" "mysqldump -q -u \"$MUSER\" -h \"$MHOST\" -p\"$MPASS\" \"$db\" --no-create-db | gzip -9 > \"$FILE\"" 2> "$ERROR"
Es decir, todas las variables utilizadas como argumentos de línea de comando deben protegerse entre comillas. Las comillas dobles alrededor de las variables garantizan que la expresión se trate como un valor único, por lo que el shell no la dividirá en palabras. Tenga en cuenta que es necesario escapar "
el contenido incrustado y escribirlo como . Una solución más sencilla es utilizar comillas simples en lugar de comillas dobles integradas, como esta:"..."
\"
ssh "$SUSER@$SHOST" "mysqldump -q -u '$MUSER' -h '$MHOST' -p'$MPASS' '$db' --no-create-db | gzip -9 > '$FILE'" 2> "$ERROR"
Por último, me pregunto si realmente quería tenerlo 2> "$ERROR"
en el host local y no en el host remoto. Sospecho que realmente querías eso en el host remoto, por lo que es otro error en la línea de comando original. Si ese es el caso, aquí está la solución:
ssh "$SUSER@$SHOST" "mysqldump -q -u '$MUSER' -h '$MHOST' -p'$MPASS' '$db' --no-create-db | gzip -9 > '$FILE' 2> '$ERROR'"