Пароль сценария оболочки со специальными символами

Я создал сценарий резервного копирования для 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
3
задан 19 December 2017 в 02:11

3 ответа

Да. Это помогло выйти из специальных символов:

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

, Но была все еще проблема с mysqldump. Я наконец узнал, что mysqldump только работал на меня с паролями со специальными символами, когда я не говорю mysqldump хост (-h имя хоста). Это, кажется, ошибка. Или не так ли?

, К сожалению, у меня также есть сайты, где mysql сервер является другим хостом. Таким образом, это решение не идеально.

1
ответ дан 19 December 2017 в 12:11
  • 1
    Отдельная пользовательская опция на самом деле звучит довольно оригинальной! Попробует, когда у меня будет изменение. – Bib-lost 9 October 2017 в 04:11

Вашему паролю нужно было выйти из специальных символов. Таким образом, если Ваш старый пароль xgT{uic[Is?uJ+, это должно будет стать xgT\{uic\[Is\?uJ\+ (Наклонная черта перед специальными символами).

Вы могли бы также хотеть посмотреть на что-то уже записанное, чтобы сделать это такой как AutoMySQLBackup, но я не уверен, нужно ли Вам ежедневно, еженедельные или ежемесячные резервные вращения. Однако то же правило применяется, если пароль имеет специальные символы, тех специальных символов нужно оставить.

Hope, которая помогает!

1
ответ дан 19 December 2017 в 12:11
  • 1
    Если Вы умны со сценариями (я не), Вы могли бы заставить сценарий брать имя файла в качестве аргумента, компилировать программу и затем выполнять их. – Charles Green 9 October 2017 в 10:10

Необходимо записать как это:

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'"
0
ответ дан 1 December 2019 в 16:58

Другие вопросы по тегам:

Похожие вопросы: