2014-12-23 4 views
1

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

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

Почему?

[email protected]: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 
+1

MySQL всегда отображает приглашение перед чтением пароля. Не имеет значения, поступает ли вход от терминала или здесь-документа. – Barmar

+0

@ Бармар Да, это правильно. Я думаю, что мне нужно прояснить проблему следующим образом: в других хостах mysql запрашивает «Enter password:», но это не останавливается; он просто принимает уже заданный пароль. Однако в этом случае он останавливается и ждет ввода пароля вручную. – RGO

+0

Вы правы, я вижу это в своей системе Linux. Он должен читать пароль от '/ dev/tty', а не' stdin'. – Barmar

ответ

0

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

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

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

Это решение работает, потому что MySQL клиент запутывает пароль, чтобы он не отображается в выводе команд процесса листинга, как пс. Запустить:

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

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

Это был известный ошибка из клиента в MySQL, обратно в тот же день, но был зафиксирован в 2002 году

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

+1

Он сказал, что не хочет вводить пароль в командной строке. Предположительно потому, что он появляется в 'ps'. – Barmar

+0

Это абсолютно НЕ ИСТИННО! Клиент «mysql» специально обфускает текст пароля, предоставленный в командной строке, поэтому он показывает это в выводе «ps»: mysql -uroot --password = x xxxxxxxxxxxxxx -s. Я не заслуживаю этого. Пожалуйста, кто бы ни дал мне это -1 (я новичок в этом), проверьте свои факты. Сделайте «ps» на отдельной консоли и убедитесь сами. Кроме того, используя этот метод, пароль не отображается в выводе команды «history». –

+0

Вам нужно отредактировать ответ так, чтобы SO удалил мой downvote. – Barmar