Stellen Sie über die Befehlszeile eine Verbindung zu MySQL her, ohne dass ein Root-Passwort erforderlich ist

11

Ich erstelle ein Bash-Skript für einige Aufgaben. Eine dieser Aufgaben ist das Erstellen einer MySQL-Datenbank aus demselben Bash-Skript. Was ich gerade mache, ist das Erstellen von zwei Variablen: eine für den Benutzernamen des Geschäfts und die andere für das Passwort des Geschäfts. Dies ist der relevante Teil meines Skripts:

MYSQL_USER=root
MYSQL_PASS=mypass_goes_here

touch /tmp/$PROY.sql && echo "CREATE DATABASE $DB_NAME;" > /tmp/script.sql
mysql --user=$MYSQL_USER --password="$MYSQL_PASS" < /tmp/script.sql
rm -rf /tmp/script.sql

Aber immer eine Fehlermeldung erhalten, dass der Zugriff für Benutzer root ohne PASSWORT verweigert wurde. Was mache ich falsch? Ich muss das gleiche für PostgreSQL tun.

ReynierPM
quelle
Führen Sie ein Debugging durch (-: Versuchen echo "$MYSQL_PASS"Sie es, bevor Sie es an die mysqlLeitung übergeben. Hat es das richtige Passwort?
KM.
Können Sie sich wie gewohnt ohne das Skript anmelden?
Qweet
4
-h fehlt. Es ist auch keine gute Idee, Passwörter in eine Befehlszeile einzufügen, da sie für alle Anrufer sichtbar sind ps wwaux.
Nils

Antworten:

23

Sowohl für MySQL als auch für PostgreSQL können Sie Ihren Benutzer und Ihr Kennwort in der lokalen Konfigurationsdatei angeben. .my.cnf für MySQL und .pgpass für PostgreSQL. Diese Dateien sollten sich in Ihrem Home-Verzeichnis befinden (dh ~ / .my.cnf).

.my.cnf:

[mysql]
user=user
password=password

.pgpass:

host:port:database:user:password

Sie können hier einen Platzhalter eingeben, der ******* durch ein beliebiges Feld ersetzt.

PS: Geben Sie niemals ein Passwort in der Befehlszeile an! Dies kann mit ps perfekt sichtbar sein, wenn Ihr System nicht so konfiguriert ist, dass keine Prozesse angezeigt werden, die anderen Benutzern gehören.

@thinice: Wenn Sie diese Dateien wirklich sicher erstellen möchten, sollten Sie Folgendes tun:

umask 077
touch .my.new.config
umask 022 # or whatever was your default

Auf diese Weise würde die Datei von Anfang an mit sicheren Berechtigungen erstellt, und kein Lauscher hätte die Möglichkeit, Ihr Passwort zu verlieren.

PostgreSQL wird die Verwendung der Datei mit Berechtigungen über 0600 ohnehin ablehnen.

kworr
quelle
1
Für MySQL, den MySQL-Client, können Sie mit auf eine bestimmte Konfigurationsdatei verweisen --defaults-extra-file=filename. Dies kann nützlich sein, wenn Sie es an einem nicht standardmäßigen Ort platzieren oder einfach eine temporäre Datei erstellen möchten. Ist verdächtig, dass es eine ähnliche Option mit PostgreSQL ist, aber ich bin damit nicht vertraut.
Zoredache
1
Und aus Liebe zu Happy Gilmores Shorts chmod diese Datei0600
Thinice
@kworr Ich werde das schon versuchen, aber mein MySQL beginnt nicht, diese Parameter unter /etc/my.cnf zu ändern :( wusste die Ursache nicht. Ich werde es später noch einmal versuchen
ReynierPM
Es ist nicht die /etc/my.cnf. Antwort aktualisieren.
Kworr
@kworr Ich versuche deine Lösung, aber funktioniert überhaupt nicht. Die Datenbank wird durch leer erstellt und nicht in phpMyAdmin oder einem anderen GUI-Tool angezeigt. Ich setze das Datenverzeichnis in /etc/my.cnf auf datadir = / data / var / lib / mysql und setze die Berechtigungen auf 0755 unter / data / var / lib / mysql und den Eigentümer auf mysql: mysql, warum die Datenbank leer ist ? Wo ist das Problem?
ReynierPM
2
MYSQL_USER="root"
MYSQL_PASSWORD="PASSWORD"
DBNAME="DB_NAME"

mysql -u$MYSQL_USER -p$MYSQL_PASSWORD -e "CREATE DATABASE $DBNAME;" 2> /tmp/error1

STATUS=$? 
if [ $STATUS -eq 0 ];
then 
    echo -e "Database '$DBNAME' is created"
elif (grep -i "^ERROR 1007" /tmp/error1 > /dev/null);
then
    echo -e "Database '$DBNAME' already exists"
else
    echo -e "Failed to create database '$DBNAME'"
fi

rm -r /tmp/error1 

Dies wird den Trick machen Danke

Abhijeet Kasurde
quelle
2
mysql_config_editor set --login-path=storedPasswordKey --host=localhost --user=root --password

Wie führe ich eine Befehlszeile mit einem sicheren Passwort aus? benutze den Konfigurationseditor !!!

Ab MySQL 5.6.6 können Sie das Passwort in einer Konfigurationsdatei speichern und dann solche CLI-Befehle ausführen ....

mysql --login-path=storedPasswordKey ....

--login-path ersetzt Variablen ... Host, Benutzer UND Passwort. ausgezeichnet richtig!

Artistan
quelle
1
Danke für das Teilen! Es gibt nur einen Fall von diesem Ansatz. Der Parameter --login-path muss der erste Parameter des Aufrufs sein, sonst erhalten Sie die Meldung "unbekannte Variable 'login-path = local'".
André Augusto
1
MYSQL_USER="root"
MYSQL_PASS="mypass_goes_here"

touch /tmp/$PROY.sql && echo "CREATE DATABASE $DB_NAME;" > /tmp/script.sql
mysql --user=$MYSQL_USER --password=$MYSQL_PASS < /tmp/script.sql
rm -rf /tmp/script.sql

Stellen Sie sicher, wie Sie Ihren Pass schreiben und er entkommt nicht

--defaults-extra-file = ist eine gute Sache (tm) (c)

GioMac
quelle
1

Setzen Sie keine Anführungszeichen um das Kennwort, da die Anführungszeichen in diesem Fall als Teil des Kennworts betrachtet werden.

John Gardeniers
quelle
0

Eine ähnliche Frage gibt es bei StackOverflow.

Um meine Antwort von dort zusammenzufassen.

Du kannst export MYSQL_PWD=yourverysecretpassword.

Der Vorteil dieser Methode gegenüber der Verwendung einer Konfigurationsdatei besteht darin, dass Sie keine separate Konfigurationsdatei benötigen, um mit Ihrem Skript synchron zu bleiben. Sie müssen nur das Skript warten.

Es ist kein Nachteil dieser Methode.

Das Kennwort ist für andere Benutzer im System nicht sichtbar (es wäre sichtbar, wenn es sich in der Befehlszeile befindet). Die Umgebungsvariablen sind nur für den Benutzer sichtbar, der den Befehl mysql und root ausführt.

Das Kennwort ist auch für alle sichtbar, die das Skript selbst lesen können. Stellen Sie daher sicher, dass das Skript selbst geschützt ist. Dies unterscheidet sich in keiner Weise vom Schutz einer Konfigurationsdatei. Sie können das Kennwort weiterhin aus einer separaten Datei beziehen, wenn das Skript öffentlich lesbar sein soll (export MYSQL_PWD=$(cat /root/mysql_password) . Es ist immer noch einfacher, eine Variable zu exportieren, als eine Konfigurationsdatei zu erstellen.

Z.B,

$ export MYSQL_PWD=xoF3mafn5Batxasdfuo
$ mysqldump -u root mysql | head
-- MySQL dump 10.13  Distrib 5.6.23, for Linux (x86_64)
--
-- Host: localhost    Database: mysql
-- ------------------------------------------------------
-- Server version   5.6.23
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
Chutz
quelle