So übergeben Sie Eingaben von einem Skript mithilfe von Bash in ein anderes

7

Ich schreibe ein Skript, in dem ich das mysql_secure_installationSkript starten und an jeder Eingabeaufforderung die entsprechenden Antworten geben möchte . Ich habe versucht, Echo wie folgt zu verwenden:

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

Es funktioniert nicht vollständig. Es scheint, dass es die letzten 5 Fragen richtig beantwortet, aber die ersten 3 nicht richtig beantwortet (dies befindet sich auf einer CentOS 6.5Box). Hier ist die Ausgabe:

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.

Es sollte eine Rücksendung senden, wenn Sie nach dem Root-Passwort gefragt werden. Dann sollte es eine weitere Rückgabe senden, wenn Sie aufgefordert werden, das Root-Passwort festzulegen. Wie Sie jedoch an der Ausgabe sehen können, geschieht dies nicht.

Was muss ich tun, damit dies wie erwartet funktioniert?

user5013
quelle
1
Ich denke, entweder das Expect- oder das Pexpect-Dienstprogramm (Python-based Expect) sind die beste Wahl.
Sean Staats
Ja, verwenden Sie erwarten
Michael Martinez

Antworten:

6

Dieser Fehlerbericht auf der MySQL-Dev-Site behebt das Problem, mysql_secure_installationdass eine interaktive Benutzersitzung erforderlich ist.

Dort gibt es einige gute Diskussionen mit Tipps und Beispielen, die expectals Problemumgehung dienen. Der beste Rat, der Ihren Wunsch zu erfüllen scheint, das Skript nicht interaktiv auszuführen (dh ohne direkte Benutzerinteraktion), ist die Antwort von Daniël van Eeden, die das folgende expectSkript bereitstellt :

#!/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."

Außerdem scheint das übergeordnete Problem von Basis-MySQL-Installationen mit nicht sicherem Material in MySQL 5.6.8 behoben zu sein, jedoch nur für Neuinstallationen über RPMs oder Quellcode-Installationen, die mit der --random-passwordOption durchgeführt werden:

Neue RPM-Installationsvorgänge (keine Upgrades) rufen mysql_install_db mit der Option --random-passwords auf. Infolgedessen werden bei RPM-Installationen ab dieser Version die Root-Konten gesichert und es werden keine anonymen Benutzerkonten gespeichert. (Installationsvorgänge mit RPMs für Unbreakable Linux Network sind nicht betroffen, da sie nicht mysql_install_db verwenden .)

Für Installationsvorgänge mit einer binären .tar.gz-Distribution oder einer Quelldistribution können Sie mysql_install_db mit der Option --random-passwords manuell aufrufen , um Ihre MySQL-Installation sicherer zu machen. Dies wird insbesondere für Websites mit vertraulichen Daten empfohlen.

JakeGould
quelle
1
Schön geschriebene ausführliche Antwort (+1). Ich habe noch nie von Erwartung gehört, aber es wird etwas sein, das ich auf jeden Fall untersuchen werde. Ich mag beide Antworten, nicht sicher, welche ich wählen soll.
user5013
1
@JakeGould nur als Anmerkung, das Skript ist ein expectSkript, kein bashSkript.
DerfK
1
Für diejenigen, die eine vollständig skriptbasierte Installation mit MySQL 5.6+ unter Ubuntu 16.04 LTS wünschen
Michael Johansen
@ JakeGould Vielen Dank. Viel verwiesen, aber endlich hat Ihre Lösung für mich funktioniert.
Babin Lonston
7

Das kannst du nicht machen. Wenn Sie mit einem Skript interagieren möchten, müssen Sie etwas wie " Erwarten" (1) verwenden - es gibt Beispiele hier auf SF und im breiteren Internet, wie dies zu tun ist.

Sie können einen Großteil der mysql_secure_Installation mit emulieren

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

Danach müssen Sie nur noch ein Root-Passwort festlegen.

user9517
quelle
Vielen Dank für diese Antwort, die es einfach macht, sie in ein Bash-Skript aufzunehmen. Es ist einfach und auf den Punkt.
user5013
+1 für schöne und einfache Lösung ....
Harikrishnan