次の ssh スクリプトがあります:
#Here I am getting the mysql password for the root user
password=$(cat /root/.my.cnf | grep "password" | awk -F\" '{print $2}')
#here I am trying to dump the database remotely
mysqldump -uroot -p$password $db | ssh root@$destination_server "cat > /backup/mysql/$db.sql"
問題は、次のエラーが発生することです。
/bin/bash: -c: line 0: syntax error near unexpected token `)'
/bin/bash: -c: line 0: `mysqldump -uroot -pbyt)uy6 database_name '
いろいろテストしてみたところ、パスワード内の特殊文字が原因でエラーが発生していることがわかりました。パスワードは .my.cnf ファイルから取得しているので、エスケープ文字をハードコーディングしてもエスケープできません。
$password 変数内の特殊文字を検索し、エスケープ スラッシュ ("\") を追加する方法を教えていただけませんか。
編集: vzctl exec コマンドを使用して OpenVZ 部分仮想化経由でこれを実行していることを忘れていました。これが、要求どおりに特殊文字をエスケープできる方法が必要だった理由です。私が開発した方法は、sed コマンドを単純に使用するものでした。
sed 's/[!-+]/\\&/g'
皆様のご協力に感謝いたします。
よろしくお願いします!
答え1
これらを行う必要はありません。HBruijn がコメントで述べたように、$HOME/.my.cnf
ファイルにはすでに認証情報が含まれており、特別な操作をしなくても MySQL のコマンドライン ツールによって自動的に認証情報が使用されます。
だから、こうするだけです:
mysqldump $db | ssh root@$destination_server "cat > /backup/mysql/$db.sql"