Umwelt: centos7 + mariadb5.5.64.
Lassen Sie mich die Installationsinformationen auf dem Bildschirm anzeigen, wann sie ausgeführt werden sollen mysql_secure_installation
.
# mysql_secure_installation
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY!
In order to log into MariaDB to secure it, we'll need the current
password for the root user. If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.
Enter current password for root (enter for none):
OK, successfully used password, moving on...
Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.
Set root password? [Y/n] y
New password:
Re-enter new password:
Password updated successfully!
Reloading privilege tables..
... Success!
By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them. This is intended only for testing, and to make the installation
go a bit smoother. You should remove them before moving into a
production environment.
Remove anonymous users? [Y/n] y
... Success!
Normally, root should only be allowed to connect from 'localhost'. This
ensures that someone cannot guess at the root password from the network.
Disallow root login remotely? [Y/n] y
... Success!
By default, MariaDB comes with a database named 'test' that anyone can
access. This is also intended only for testing, and should be removed
before moving into a production environment.
Remove test database and access to it? [Y/n] y
- Dropping test database...
... Success!
- Removing privileges on test database...
... Success!
Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.
Reload privilege tables now? [Y/n] y
... Success!
Cleaning up...
All done! If you've completed all of the above steps, your MariaDB
installation should now be secure.
Thanks for using MariaDB!
Ich schreibe ein Automation Expect-Skript, um Mariadb zu installieren.
vim secure.exp
set timeout 60
spawn mysql_secure_installation
expect {
"Enter current password for root (enter for none): " {send "\r";exp_continue}
"Set root password? [Y/n] " {send "y\r";exp_continue}
"New password:" {send "123456\r";exp_continue}
"Re-enter new password:" {send "123456\r";exp_continue}
"Remove anonymous users? [Y/n]" {send "y\r";exp_continue}
"Disallow root login remotely? [Y/n]" {send "y\r";exp_continue}
"Remove test database and access to it? [Y/n]" {send "y\r";exp_continue}
"Reload privilege tables now? [Y/n]" {send "y\r";exp_continue}
}
Zum Ausführen /usr/bin/expect secure.exp
stoße ich auf den Fehler:
spawn mysql_secure_installation
invalid command name "Y/n"
while executing
"Y/n"
invoked from within
"expect {
"Enter current password for root (enter for none): " {send "\r";exp_continue}
"Set root password? [Y/n] " {send "y\r";exp..."
(file "secure.exp" line 3)
Es nützt nichts, wie folgt zu schreiben:
set timeout 60
spawn mysql_secure_installation
expect {
"Enter current password for root (enter for none): " {send "\r";exp_continue}
"Set root password? \\[Y/n] " {send "y\r";exp_continue}
"New password:" {send "123456\r";exp_continue}
"Re-enter new password:" {send "123456\r";exp_continue}
"Remove anonymous users? \\[Y/n]" {send "y\r";exp_continue}
"Disallow root login remotely? \\[Y/n]" {send "y\r";exp_continue}
"Remove test database and access to it? \\[Y/n]" {send "y\r";exp_continue}
"Reload privilege tables now? \\[Y/n]" {send "y\r";exp_continue}
}
Gleicher Fehler:
invalid command name "Y/n"
while executing
"Y/n"
invoked from within
"expect {
"Enter current password for root (enter for none): " {send "\r";exp_continue}
"Set root password? \\[Y/n] " {send "y\r";exp_conti..."
(file "secure.exp" line 3)
Wie kann ich dann mein Exp-Skript reparieren?
[ ... ]
ist Befehlsersetzung, die wie Shell ist$( ... )
. Also"Set root password? [Y/n] "
sollte geschrieben werden als"Set root password? \\[Y/n] "
.Antworten:
Diese Skripte warten auf die optionale Ausgabe (
timeout -1
bedeutet "kein Timeout") und können unterschiedliche Antworten unterscheiden, je nachdem, wieyum install
und vonmysql_secure_installation
. Mit#!/bin/expect -f
as shebang können die Skripte ausgeführt werden, wenn sie eingestellt wurdenchmod +x
.A) Zunächst
mariadb_yum.exp
(erfordertsu
odersudo
):B) Und dann
mariadb_sec.exp
(nicht erforderlichsudo
):Zu Debugging-Zwecken - oder um die Antwort zu validieren - kann
expect
mit Protokollstufe ausgeführt werdenstrace 4
. Dies ist wahrscheinlich so seriös, wie es eine Quelle beim Schreiben vonexpect
Skripten nur kann, da es gut anzeigt, was vor sich geht und vor allem in welcher Reihenfolge die Dinge geschehen:Der Befehl
set exp_internal 1
kann verwendet werden, um eine Ausgabe für den Regex-Abgleich zu erhalten.Eine mögliche Quelle der Verwirrung könnte sein, wo man die Prozesse erzeugt - da man mehrere Prozesse auf verschiedenen Hosts erzeugen kann, z.
ssh
lokal und dannyum
und aus dermysql_secure_installation
Ferne.$spawn_id
Zum Skript hinzugefügt ; der Boden einesclose
Anruf könnte überflüssig sein, da es ohnehin schon istEOF
(nur um zu zeigen , wiespawn
&close
Prozesse):Fazit: Das
mariadb_sec.exp
Skript könnte wahrscheinlich weiter verbessert werden, z. Wenn Sie zuerst kein Passwort senden und sehen, was passiert, senden Sie das Passwort weiterERROR 1045
(wenn zuvor bereits ein Passwort festgelegt wurde). Es kann sicher sein anzunehmen, dass man das Passwort festlegen muss, wenn der Server gerade installiert wurde (außer dasyum reinstall
das gleiche Ergebnis liefert). Hatte gerade keinen leeren CentOS-Container, um alle Fälle zu testen. Sofern nicht in einerroot
Shell ausgeführt, müssen beide Arten von Kennwörtern an ein Skript übergeben werden, um dies von der Installation bis zur Nachinstallation zu automatisieren.Wahrscheinlich erwähnenswert ist, dass auf GCE
sudo
nicht nach einem Passwort gefragt werden würde; Je nach Umgebung gibt es tatsächlich geringfügige Unterschiede, da sich diese CentOS-Container-Images unterschiedlich verhalten. In diesem Fall (da keinesu
Erkennung von Containerbildern vorhanden ist )mariadb_yum.exp
bleibt das Skript möglicherweise für30
Sekunden hängen und fährt dann fort.Die seriösesten Quellen, die ich anbieten kann, sind das
expect
von Don Libes @ NIST geschriebene Handbuch und das TCL / TK-Handbuch fürexpect
, zusammen mit dem zufällig aufgerufenen SourceForge-Projektexpect
.quelle
Quadratische Klammern werden nicht nur zum Ersetzen von Befehlen verwendet, sondern sind auch speziell für Glob-Muster .
Sie können entweder den
-exact
Schalter verwenden, während Sie die eckigen Klammern in Anführungszeichen setzen:Oder verwenden Sie geschweifte Klammern anstelle von Anführungszeichen:
Zu Ihrer Information, Sie können das Expect-Skript für Sie generieren lassen, indem Sie Folgendes verwenden
autoexpect
:Dadurch wird ein Erwartungsskript generiert, das
script.exp
in Ihrem aktuellen Arbeitsverzeichnis aufgerufen wird .quelle