Вопрос: Как передать входные данные из одного сценария в другой с помощью bash


Я пишу сценарий, где я хочу запустить mysql_secure_installation сценарий и предоставить соответствующие ответы в каждом приглашении. Я пробовал использовать эхо:

echo -e "\n\n$db_pass\n$db_pass\n\n\n\n\n" | /usr/bin/mysql_secure_installation

Это не работает полностью. Кажется, что он правильно отвечает на последние 5 вопросов, но не отвечает на первые 3 правильно (это на CentOS 6.5 коробка). Вот результат:

In order to log into MySQL to secure it, we'll need the current
password for the root user.  If you've just installed MySQL, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

stty: standard input: Invalid argument
Enter current password for root (enter for none):
stty: standard input: Invalid argument
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MySQL
root user without the proper authorisation.

Set root password? [Y/n]  ... skipping.

Он должен отправить ответ при запросе пароля root. Затем он должен отправить другое возвращение, когда его попросят установить пароль root. Однако, как вы можете видеть из вывода, который не происходит.

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


7
2018-05-06 21:04


Источник


Я думаю, что любой из ожидающих или pexpect (на основе python) утилит - ваш лучший выбор. - Sean Staats
да, используйте ожидание - Michael Martinez


Ответы:


Эта отчет об ошибках на сайте dev решает проблему mysql_secure_installation требующий интерактивной сессии пользователя.

Там есть хорошая дискуссия, в которой есть несколько советов и примеров, которые используют expect как обходной путь. Лучший совет, который, по-видимому, касается вашего желания запускать сценарий не интерактивно (т. Е .: без прямого взаимодействия с пользователем), является ответом Даниэля ван Эдена, который обеспечивает следующее expect сценарий:

#!/usr/bin/expect --
spawn /usr/local/mysql/bin/mysql_secure_installation

expect "Enter current password for root (enter for none):"
send "\r"

expect "Set root password?"
send "y\r"

expect "New password:"
send "password\r"

expect "Re-enter new password:"
send "password\r"

expect "Remove anonymous users?"
send "y\r"

expect "Disallow root login remotely?"
send "y\r"

expect "Remove test database and access to it?"
send "y\r"

expect "Reload privilege tables now?"
send "y\r"

puts "Ended expect script."

Кроме того, похоже, что основная проблема базового MySQL устанавливает наличие незащищенных вещей представляется в MySQL 5.6.8 но только для новой установки через RPM или установки исходного кода, которые сделаны с помощью --random-password опция:

Новые операции установки RPM (не обновления) вызывают mysql_install_db   с параметром --random-passwords. Как следствие, установка RPM   из этой версии будет обеспечено их корневые учетные записи и   не будет иметь учетных записей анонимного пользователя. (Установить операции с использованием RPM   для Unbreakable Linux Network не влияют, потому что они не используют    mysql_install_db.)

Для операций установки с использованием бинарного дистрибутива .tar.gz или исходного дистрибутива вы можете ссылаться mysql_install_db с   --random-passwords вручную, чтобы сделать вашу установку MySQL более безопасной. Это рекомендуется, особенно для сайтов с   чувствительных данных.


5
2018-05-06 21:21



Хорошо написанный подробный ответ (+1). Я никогда не слышал о ожидании раньше, но это будет то, что я обязательно рассмотрю. Мне нравятся оба ответа, не знаю, какой из них выбрать. - user5013
@JakeДля того, как примечание, сценарий является expect сценарий, а не bash скрипт. - DerfK
@DerfK Спасибо за разъяснение! - JakeGould
Для тех, кто хочет установить полностью скриптовую установку с MySQL 5.6+ на Ubuntu 16.04 LTS, см. Мой пост здесь: serverfault.com/questions/783527/... - Michael Johansen


Вы не можете этого сделать. Если вы хотите взаимодействовать со сценарием, вы должны использовать что-то вроде ожидать (1) - Есть примеры здесь, на SF и в более широком Интернете, как это сделать.

Вы можете эмулировать большую часть mysql_secure_installation с

/usr/bin/mysql -uroot -e "DELETE FROM mysql.user WHERE User=\'\'; DELETE FROM mysql.user WHERE User=\'root\' AND Host NOT IN (\'localhost\', \'127.0.0.1\', \'::1\'); DROP DATABASE IF EXISTS test; FLUSH PRIVILEGES;"

Все, что вам нужно сделать после этого, - установить пароль root.


6
2018-05-06 21:17



Спасибо за этот ответ, который позволяет легко включать в сценарий bash. Это просто и точно. - user5013
+1 для приятного и легкого решения .... - Harikrishnan