Я создал сценарий резервного копирования для 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
Да. Это помогло выйти из специальных символов:
MPASS=$(printf "%q\n" "$DB_PASS")
, Но была все еще проблема с mysqldump. Я наконец узнал, что mysqldump только работал на меня с паролями со специальными символами, когда я не говорю mysqldump хост (-h имя хоста). Это, кажется, ошибка. Или не так ли?
, К сожалению, у меня также есть сайты, где mysql сервер является другим хостом. Таким образом, это решение не идеально.
Вашему паролю нужно было выйти из специальных символов. Таким образом, если Ваш старый пароль xgT{uic[Is?uJ+
, это должно будет стать xgT\{uic\[Is\?uJ\+
(Наклонная черта перед специальными символами).
Вы могли бы также хотеть посмотреть на что-то уже записанное, чтобы сделать это такой как AutoMySQLBackup, но я не уверен, нужно ли Вам ежедневно, еженедельные или ежемесячные резервные вращения. Однако то же правило применяется, если пароль имеет специальные символы, тех специальных символов нужно оставить.
Hope, которая помогает!
Необходимо записать как это:
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'"