MySQL root автоматизация смены пароля пользователя - PullRequest
1 голос
/ 19 апреля 2020

народ,

Я пытаюсь автоматизировать MySQL root временную смену пароля пользователя.

Сведения:

ОС Centos7, mysql Вер. 8.0.19-10 для Linux на x86_64 (Percona Server (GPL), выпуск 10, редакция f446c04)

Мой скрипт:

#!/bin/sh
PSW=$1
MYPASS = `grep 'temporary password' /var/log/mysqld.log|awk '{print $13}'`
echo $MYPASS
sleep 3
echo "ALTER USER 'root'@'localhost' IDENTIFIED WITH   mysql_native_password BY '$PSW';" >> /root/my.sql
echo "GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION;" >> /root/my.sql
sleep 3
mysql --connect-expired-password -u root --password='$MYPASS' mysql < /root/my.sql
sleep 5                    

Логотипы скрипта c

Я выполняю скрипт, который называется prepare_db. sh, из оболочки с помощью команды и передаю переменную PSW (хочу изменить temp PSW к этому)

sh prepare_db.sh Pass123

он захватывает temp mysql root PSW присваивает его переменной MYPASS создает мой. sql файл, который выглядит так:

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'Pass123';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION;

когда sql файл создан, скрипт автоматически пытается выполнить его с помощью команды:

mysql --connect-expired-password -u root --password='$MYPASS' mysql < /root/my.sql

Проблема

Каждый раз, когда я получаю сообщение о том, что доступ запрещен:

ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

Странная вещь

Если я пытаюсь запустить ту же команду из оболочки, я не получаю ошибки и пароль не меняется ..

mysql --connect-expired-password -u root --password='e=F4D4N7<-gp' mysql < /root/my.sql

Пожалуйста, помогите мне найти ошибку, или решение, как мне достичь своей цели - автоматизировать сброс пароля root к временному пользователю

Заранее спасибо!

1 Ответ

1 голос
/ 19 апреля 2020

Проблема в том, что вы используете одинарные кавычки в вашей команде. В одинарных кавычках переменные не раскрываются.

Итак, вы буквально отправляете $MYPASS в качестве пароля вместо содержимого переменной MYPASS!

Измените его на двойные кавычки:

mysql --connect-expired-password -u root --password="$MYPASS" mysql < /root/my.sql

Совет на будущее: Если вы (временно) добавите set -x в начале вашего скрипта, вы увидите каждую строку, напечатанную до его выполнения, после оценки. Таким образом, вы также заметили, что существует литерал $MYPASS.


РЕДАКТИРОВАТЬ: Как Сайрус упоминал в комментарии , есть еще одна проблема, которую нужно исправить, прежде чем это сможет работа: Измените /bin/sh на /bin/bash в shebang вашего скрипта, и если вы запускаете его вручную, используйте bash вместо sh.

...