сценарий оболочки базы данных, включая пароль со специальными символами

424
fritzmg

Я пытаюсь создать сценарий оболочки для mysqldumpmysql) операции, где пароль хранится непосредственно в сценарии. Пароль содержит специальные символы, которые необходимо обрабатывать соответствующим образом. Однако я не могу понять, какая комбинация действительно работает.

Например, следующие действия выполняются непосредственно на консоли:

mysqldump -u the_user --hex-blob --add-drop-table source_db --password=the\$password | mysql -u the_user target_db --password=the\$password 

Пароль содержит, $который затем экранируется \$. Тем не менее, точно такая же команда не работает при вводе в shell_script.sh. Когда я выполняю скрипт, MySQL жалуется

Access denied for user 'the_user'@'localhost' 

До сих пор я попробовал следующее в скрипте:

mysqldump -u the_user --hex-blob --add-drop-table source_db --password=the\$password | mysql -u the_user target_db --password=the\$password  mysqldump -u the_user --hex-blob --add-drop-table source_db --password="the\$password" | mysql -u the_user target_db --password="the\$password"  mysqldump -u the_user --hex-blob --add-drop-table source_db --password='the\$password' | mysql -u the_user target_db --password='the\$password'  mysqldump -u the_user --hex-blob --add-drop-table source_db --password="the$password" | mysql -u the_user target_db --password="the$password"  mysqldump -u the_user --hex-blob --add-drop-table source_db --password='the$password' | mysql -u the_user target_db --password='the$password' 

Кажется, ни один из них не экранирует пароль должным образом. Из них только первый работает правильно, когда используется непосредственно на оболочке.

Что мне не хватает? Как мне указать пароль, чтобы эти команды также работали из сценария оболочки?

0
Является ли фактический проблемный символ знаком доллара? choroba 5 лет назад 0
Фактический пароль также содержит другие специальные символы, например, `%`, `=`, `?`, `#`. Однако из этого мне нужно только избежать `\ $` - по крайней мере, непосредственно в оболочке. `%` Находится в начале пароля, если это что-то меняет (что может?). fritzmg 5 лет назад 0
`%` совсем не особенный. `?` может вызвать проблемы, так как он может попытаться соответствовать. Пробел также может быть проблемой. Отбрасывание всех проблемных персонажей должно сработать. choroba 5 лет назад 0
Все еще не повезло. Я убрал каждый символ за пределами `[a-zA-Z0-9]`, и, тем не менее, команда не работает при выполнении через скрипт. Это все еще работает только при выполнении непосредственно в командной строке. fritzmg 5 лет назад 0
Вы уверены, что в сценарии нет `ssh` или другого дополнительного уровня интерпретации? choroba 5 лет назад 0
Я не совсем понимаю, что вы имеете ввиду. Кроме команды `echo` до и после упомянутой команды, в файле` .sh` больше ничего нет. fritzmg 5 лет назад 0
Попробуйте запустить скрипт с `set -xv`, чтобы увидеть, как интерпретируется строка. choroba 5 лет назад 0
Спасибо за предложение :). Однако мне кажется, что мне даже нужна помощь для реализации _that_… когда я помещаю `set -xv` в качестве первой строки в моем скрипте, я получаю только`: неверный option_staging.sh: строка 1: набор: -` `set: Использование: набор [-abefhkmnptuvxBCHP] [-o имя-опции] [-] [аргумент ...] ` fritzmg 5 лет назад 0
Работает ли скрипт в bash? choroba 5 лет назад 0
По умолчанию это так, да. Если я запускаю его через `sh`, я получаю` shell_script.sh: 1: set: Illegal option -`. fritzmg 5 лет назад 0
Ошибка странная. У вас есть строка MSWin, заканчивающаяся после `set -xv`? choroba 5 лет назад 0
Нет, не то, что я знаю. Я редактирую файл прямо на Linux-машине через `vi`. Там я должен увидеть любые ошибочные окончания строк MSWin. fritzmg 5 лет назад 0

3 ответа на вопрос

0
Zhihua Lai

Попробуйте ввести пароль (без новой строки и без Escape) в текстовый файл, например, pass.txtа затем используйте следующее

mysqldump -u the_user --hex-blob --add-drop-table source_db --password=$(cat pass.txt) | mysql -u the_user target_db --password=$(cat pass.txt) 
Это не сработало. Я предполагаю, что "без NR" вы имеете в виду без экранирования символов? fritzmg 5 лет назад 0
без побега и без новых линий. Zhihua Lai 5 лет назад 0
Да, это то, что я сделал. Однако `echo pass.txt` на самом деле не отображает содержимое` pass.txt` ... он просто выводит `pass.txt`;) fritzmg 5 лет назад 0
Вы пробовали `cat pass.txt`? Konrad Botor 5 лет назад 0
да, должен быть `cat pass.txt`. Мои ошибки Zhihua Lai 5 лет назад 0
0
Konrad Botor

Я бы сделал следующее:

printf -v password "%q" "\$password" mysql --password=$password 

Более подробная информация о printf: printf на wiki.bash-hackers.org

Это тоже (совсем) не сработало. Также с вашей версией части команды mysql (без `=` между `--password` и` $ password`) я просто попадаю в интерфейс `mysql`. fritzmg 5 лет назад 0
На самом деле отсутствие `=` было опечаткой. Спасибо за указание. Konrad Botor 5 лет назад 0
Да, я так и подозревал. Тем не менее, это все еще не работает :( fritzmg 5 лет назад 0
0
Dave

Добавьте пароль к SQL-файлу ini в отдельном [mysqldump]разделе. Если вам это нужно для вызова MYSQL, добавьте его также в [mysql]раздел INI-файла.

[mysqldump] password="the$password"  [mysql] password="the$password" 

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