Я пытаюсь создать сценарий оболочки для операции 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'

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

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

3 ответа3

0

Попробуйте ввести пароль (без новой строки и без 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)
0

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

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

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

0

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

[mysqldump]
password="the$password"

[mysql]
password="the$password"

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .