
Ich arbeite an einem Skript, um den Status mehrerer Remote-MySQL-Hosts zu überprüfen, indem ich mich bei jedem Server anmelde und aufzeichne, ob die Anmeldung erfolgreich war oder nicht. Die Idee besteht darin, die Anmeldedaten für die MySQL-Hosts in einer CSV-Datei zu speichern und das Skript diese Datei durchlaufen zu lassen, sich anzumelden und aufzuzeichnen, ob die Anmeldung erfolgreich war.
Die in der CSV-Datei gespeicherten MySQL-Anmeldedaten wären folgende:
$host,$user,$password
Da ich ein Neuling im Bash-Scripting bin, verstehe ich nicht so recht, wie ich den Teil am besten angehe, in dem das Skript eine CSV-Datei durchläuft, um MySQL-Details abzurufen. Kann mir jemand helfen?
Derzeit habe ich Folgendes für einzelne MySQL-Hosts getestet
mysql -h$host -=$user -p$pass -d$db -e exit
if [ "$?" -eq "0" ]
then
echo "Connection established"
else
echo "Connection not established"
fi
Dank im Voraus.
Antwort1
Sie können das integrierte Feature verwenden und ihm mithilfe der Shell-Variable (Eingabefeldtrennzeichen) read
mitteilen, dass die Zeile an Kommas getrennt werden soll :IFS
$ cat file
user1,host1,pass1
user2,host2,pass2
$ while IFS="," read -r user host pass; do echo "$user:$host:$pass"; done < file
user1:host1:pass1
user2:host2:pass2
Sie möchten also in Ihrem Skript etwas wie:
while IFS="," read -r user host pass; do
if mysql -h "$host" -u "$user" -p"$pass" -e exit; then
echo "Connection established"
else
echo "Connection failed" fi;
done < file
Das oben genannte funktioniert jedoch nicht, wenn eines Ihrer Passwörter (oder andere Variablen, aber ich nehme an, dass nur die Passwörter dieses Problem haben könnten) ein Komma enthält. Wenn das für Sie ein Problem sein kann, müssen Sie das Trennzeichen durch etwas anderes anstelle eines Kommas ersetzen. Etwas, das niemals in einem Passwort vorkommen wird. Zum Beispiel ein Tabulatorzeichen, und dann können Sie Folgendes tun:
while IFS=$'\t' read -r user host pass; do
if mysql -h "$host" -u "$user" -p"$pass" -e exit; then
echo "Connection established"
else
echo "Connection failed" fi;
done < file
Antwort2
CSV ist nicht besonders praktisch, aber hier ist es.
while IFS=, read host user pass; do
if mysql -h"$host" -u"$user" -p"$pass" -d"$db" -e exit
then
echo "$host: Connection established"
else
echo "$host: Connection not established"
fi
done <file.csv
Beachten Sie, wie if
(und im Allgemeinen alle Flusssteuerungsanweisungen der Shell) dies bereits $?
im Hintergrund für Sie prüft, sodass Sie es in Ihren Skripten nur sehr selten explizit prüfen müssen.
Außerdem habe ich den Hostnamen zu den Ausgabenachrichten hinzugefügt, um sie informativer zu gestalten.
Wenn Sie stattdessen eine durch Leerzeichen getrennte Eingabedatei haben können, können Sie das herausnehmen IFS=,
und möglicherweise auch einige andere Teile Ihrer Verarbeitung vereinfachen.