MySQL запрашивает пароль при использовании heredoc

Я пытаюсь выполнить сценарий оболочки, чтобы войти в mysql как root и выполнить некоторые команды, и, чтобы не указывать пароль root в командной строке, я использую формат heredoc, как показано ниже. Однако mysql запрашивает пароль, несмотря на то, что я даю ему правильный пароль.

Точно такой же синтаксис отлично работает на некоторых других хостах, но не здесь.

Почему?

mysql@myhost:MySQL> mysql -uroot -p -s -P3306 -e 'SELECT NOW();'  <<EOF
> MyPassword
> EOF
Enter password:    <---- why does it require manual password entry in here?
2014-12-23 14:57:25

person RGO    schedule 23.12.2014    source источник
comment
MySQL всегда отображает приглашение перед чтением пароля. Неважно, поступает ли ввод с терминала или из документа здесь.   -  person Barmar    schedule 23.12.2014
comment
@ Бармар Да, это правильно. Я думаю, что мне нужно прояснить проблему следующим образом: на других хостах mysql запрашивает ввод пароля:, но он не останавливается; он просто принимает уже заданный пароль. Однако в этом случае он останавливается на достигнутом и ждет ручного ввода пароля.   -  person RGO    schedule 23.12.2014
comment
Вы правы, я вижу это в своей системе Linux. Он должен считывать пароль с /dev/tty, а не с stdin.   -  person Barmar    schedule 23.12.2014
comment
Рассматривали ли вы возможность использования файла .my.cnf вместо ввода пароля в сценарий?   -  person Barmar    schedule 23.12.2014
comment
@ Бармар Нет! но я пытаюсь избежать этого, так как не должен делать никаких изменений на хосте. Кстати... Я попытался сделать пример более понятным. Спасибо за ваш полезный комментарий.   -  person RGO    schedule 23.12.2014
comment
Удалите пробел между -p и паролем, это разбор MySQL.   -  person Wadih M.    schedule 09.09.2019


Ответы (1)


Предполагая, что вы используете интерфейс командной строки BASH или KSH:

read -s pwd;mysql -uroot --password=${pwd} -s -P3306 -e 'SELECT NOW();'

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

Это решение работает, поскольку клиент mysql скрывает пароль, поэтому он не отображается в выходных данных команд обработки списка процессов, таких как ps. . Запустите это:

read -s pwd;mysql -uroot --password=${pwd} -s -P3306

Затем, если вы откроете дополнительный интерфейс командной строки и выполните ps, вы увидите, что он показывает не пароль, а его запутанную версию в списке процессов. .

Когда-то это была известная ошибка клиента mysql, но она была исправлена ​​в 2002 году.

Использование read -s для помещения пароля в переменную имеет дополнительное преимущество, заключающееся в том, что пароль не отображается в истории интерфейса командной строки.

person Carlos Man    schedule 23.12.2014
comment
Он сказал, что не хочет вводить пароль в командную строку. Предположительно, потому что он отображается в выводе ps. - person Barmar; 23.12.2014
comment
ЭТО АБСОЛЮТНО НЕ ПРАВДА! Клиент mysql специально запутывает текст пароля, указанный в командной строке, поэтому в выводе ps он отображается следующим образом: mysql -uroot --password=x xxxxxxxxxxxxxx -s. Я этого не заслуживаю -1. Пожалуйста, тот, кто дал мне это -1 (я новичок в этом), проверьте свои факты. Сделай пс на отдельной консоли и сам увидишь. Кроме того, при использовании этого метода пароль не отображается в выходных данных команды history. - person Carlos Man; 23.12.2014
comment
Вам нужно отредактировать ответ, чтобы SO позволил мне удалить мой отрицательный голос. - person Barmar; 23.12.2014
comment
Отредактировал ответ по запросу. Заранее спасибо. - person Carlos Man; 23.12.2014