Senha do script shell com caracteres especiais

3

Eu criei um script de backup do shell mysql que funciona muito bem.

Só tem problemas com senhas com caracteres especiais como este: xgT{uic[Is?uJ+ .

Aqui está a parte importante do 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

Eu mudei para:

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

Como você pode ver, eu já tentei aspas duplas. Mas agora recebo o erro:

bash: $FILE: ambiguous redirect

Estou recebendo a senha e outras informações de um arquivo externo:

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

Dentro do meu script, pegue as informações do arquivo externo:

Source dbserver.conf
MUSER=$DB_USER
MPASS=$DB_PASS
MHOST=$DB_HOST
DBS=$DB_DATABASE
    
por HHGK 02.05.2016 / 20:04

3 respostas

1

Sua senha precisa ter os caracteres especiais escapados. Portanto, se sua senha original for xgT{uic[Is?uJ+ , ela precisará se tornar xgT\{uic\[Is\?uJ\+ (uma barra antes dos caracteres especiais).

Você também pode querer ver algo já escrito para isso, como AutoMySQLBackup , mas não tenho certeza se você precisa de rotações de backup diárias, semanais ou mensais. No entanto, a mesma regra se aplica, se a senha tiver caracteres especiais, esses caracteres especiais precisam ser escapados.

Espero que ajude!

    
por octoquad 04.05.2016 / 19:35
1

Sim. Ajudou a escapar de caracteres especiais:

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

Mas ainda havia um problema com o mysqldump. Eu finalmente descobri que o mysqldump só funcionava para mim com senhas com caracteres especiais quando eu não digo ao mysqldump o host (-h hostname). Isto parece ser um inseto. Ou não é?

Infelizmente, também tenho sites onde o servidor mysql é outro host. Então essa solução não é perfeita.

    
por HHGK 07.05.2016 / 20:34
0

Você deve escrever assim:

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

Ou seja, todas as variáveis usadas como argumentos de linha de comando devem ser protegidas por delimitação entre aspas. As aspas duplas em torno das variáveis garantem que a expressão seja tratada como um valor único, portanto, o shell não a dividirá em palavras. Observe que " incorporado em "..." precisa ser escapado, e escrito como \" . Uma solução mais simples é usar aspas simples em vez das aspas duplas incorporadas, assim:

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

Por fim, estou pensando se você realmente queria ter 2> "$ERROR" no host local e não no host remoto. Eu suspeito que você realmente queria isso no host remoto, então isso é outro erro na linha de comando original. Se for esse o caso, então aqui está a correção:

ssh "$SUSER@$SHOST" "mysqldump -q -u '$MUSER' -h '$MHOST' -p'$MPASS' '$db' --no-create-db | gzip -9 > '$FILE' 2> '$ERROR'"
    
por janos 19.12.2017 / 00:08