Como passar a entrada de um script para outro usando o bash

7

Estou escrevendo um script no qual desejo iniciar o script mysql_secure_installation e fornecer as respostas apropriadas em cada prompt. Eu tentei usar o echo assim:

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

Não funciona completamente. Parece que ele responde as 5 últimas perguntas corretamente, mas não responde as 3 primeiras corretamente (isto é em uma CentOS 6.5 box). Aqui está a saída:

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.

Ele deve enviar um retorno quando for solicitada a senha do root. Em seguida, ele deve enviar outro retorno quando solicitado a definir a senha de root. No entanto, como você pode ver na saída que não está acontecendo.

O que preciso fazer para que isso funcione como esperado?

    
por user5013 06.05.2014 / 23:04

2 respostas

5

Este relatório de erros no site de desenvolvimento do MySQL aborda o problema de mysql_secure_installation que requer um usuário interativo sessão.

Há uma boa discussão que tem algumas dicas & exemplos que fazem uso de expect como uma solução alternativa. O melhor conselho que parece endereçar seu desejo de executar o script de forma não interativa (ou seja, sem interação direta do usuário) é a resposta de Daniël van Eeden, que fornece o seguinte script 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."

Além disso, parece que a questão geral da base de instalação do MySQL tem coisas não seguras no lugar parece ser endereçado no MySQL 5.6.8 mas somente para novas instalações via RPMs ou instalação de código fonte que são feitas com a opção --random-password :

New RPM install operations (not upgrades) invoke mysql_install_db with the --random-passwords option. As a consequence, RPM installs from this version onward will have their root accounts secured, and will have no anonymous-user accounts. (Install operations using RPMs for Unbreakable Linux Network are unaffected because they do not use mysql_install_db.)

For install operations using a binary .tar.gz distribution or a source distribution, you can invoke mysql_install_db with the --random-passwords option manually to make your MySQL installation more secure. This is recommended, particularly for sites with sensitive data.

    
por 06.05.2014 / 23:21
6

Você não pode fazer isso. Se você quer interagir com um script você tem que usar algo como espera (1) - há exemplos aqui no SF e na internet mais ampla de como fazer isso.

Você pode imitar boa parte da mysql_secure_Installation com

/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;"

Tudo o que você precisa fazer depois disso é definir uma senha de root.

    
por 06.05.2014 / 23:17