У меня есть следующий скрипт 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 и добавления к ним экранирующих слешей ("\").
EDIT: Я забыл упомянуть, что я выполняю это через частичную виртуализацию OpenVZ, используя команду vzctl exec, поэтому мне нужен был метод, который позволит мне экранировать специальные символы, как я и просил. Метод, который я разработал, был простым использованием команды sed:
sed 's/[!-+]/\\&/g'
Спасибо за вашу помощь.
С наилучшими пожеланиями!
решение1
Вам не нужно ничего из этого делать. Как HBruijn упомянул в комментарии, файл $HOME/.my.cnf
уже содержит ваши учетные данные, и инструменты командной строки MySQL будут использовать их автоматически, без необходимости делать что-либо специально.
Так что просто сделайте:
mysqldump $db | ssh root@$destination_server "cat > /backup/mysql/$db.sql"