非常にうまく機能するシェルmysqlバックアップスクリプトを作成しました。
xgT{uic[Is?uJ+
のような特殊文字を使用したパスワードのみに問題があります。
スクリプトの重要な部分は次のとおりです。
#!/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
次のように変更しました。
ssh $SUSER@$SHOST 'mysqldump -q -u $MUSER -h $MHOST -p'\''$MPASS'\'' $db --no-create-db | gzip -9 > $FILE' 2> $ERROR
ご覧のとおり、すでに二重引用符を試しました。しかし、今私はエラーを取得します:
bash: $FILE: ambiguous redirect
外部ファイルからパスワードとその他の情報を取得しています:
DB_Host=000.000.000.000
DB_DATABASE=dbdame
DB_USER=db user
DB_PASS="xgT{uic[Is?uJ+"
私のスクリプト内では、外部ファイルから情報を取得します。
Source dbserver.conf
MUSER=$DB_USER
MPASS=$DB_PASS
MHOST=$DB_Host
DBS=$DB_DATABASE
パスワードには特殊文字をエスケープする必要があります。したがって、元のパスワードがxgT{uic[Is?uJ+
の場合、xgT\{uic\[Is\?uJ\+
(特殊文字の前のスラッシュ)になる必要があります。
AutoMySQLBackup など、これを行うためにすでに書かれたものを見たいかもしれませんが、毎日、毎週、または毎月のバックアップローテーションが必要かどうかわかりません。ただし、パスワードに特殊文字が含まれる場合、それらの特殊文字をエスケープする必要がある同じルールが適用されます。
お役に立てば幸いです!
はい。特別な文字をエスケープするのに役立ちました:
MPASS=$(printf "%q\n" "$DB_PASS")
しかし、mysqldumpにはまだ問題がありました。最終的に、mysqldumpにホスト(-hホスト名)を指定しないと、mysqldumpは特殊文字を含むパスワードでしか機能しないことがわかりました。これはバグのようです。それともそうではありませんか?
残念ながら、mysqlサーバーが他のホストであるサイトもあります。したがって、このソリューションは完璧ではありません。
次のように書く必要があります。
ssh "$SUSER@$SHOST" "mysqldump -q -u \"$MUSER\" -h \"$MHOST\" -p\"$MPASS\" \"$db\" --no-create-db | gzip -9 > \"$FILE\"" 2> "$ERROR"
つまり、コマンドライン引数として使用されるすべての変数は、引用符で囲むことによって保護する必要があります。変数を二重引用符で囲むと、式が単一の値として扱われるようになり、シェルはそれを単語に分割しなくなります。 "
に埋め込まれた"..."
をエスケープし、\"
として書き込む必要があることに注意してください。より簡単な解決策は、次のように、埋め込まれた二重引用符の代わりに単一引用符を使用することです。
ssh "$SUSER@$SHOST" "mysqldump -q -u '$MUSER' -h '$MHOST' -p'$MPASS' '$db' --no-create-db | gzip -9 > '$FILE'" 2> "$ERROR"
最後に、リモートホストではなくローカルホストに2> "$ERROR"
を本当に配置するつもりだったかどうか疑問に思っています。あなたは実際にリモートホストでそれを望んでいたと思うので、それは元のコマンドラインの別のエラーです。その場合、修正方法は次のとおりです。
ssh "$SUSER@$SHOST" "mysqldump -q -u '$MUSER' -h '$MHOST' -p'$MPASS' '$db' --no-create-db | gzip -9 > '$FILE' 2> '$ERROR'"