So übergeben Sie ein Passwort an die mysql-Befehlszeile

20

Ich habe MySQL - Passwort auf einer Datei gespeichert foo.php, zum Beispiel P455w0rd, wenn ich versuche , es zu benutzen:

$ cat foo.php | grep '$dbpwd=' | cut -d '"' -f 2 | mysql -U root -p mydb -h friendserver
Enter password: (holds)

$ echo P455w0rd | mysql -u root -p mydb -h friendserver
Enter password: (holds)

Bei beiden Optionen wird immer noch nach dem Passwort gefragt. Wie kann das Passwort korrekt gesendet werden stdin?

Kokizzu
quelle
3
Darf zwischen -pund Ihrem Passwort nicht leer sein .
Fırat KÜÇÜK
mysql liest das passwort nicht von stdin, ich konnte nicht herausfinden, woraus es liest.
Omn
Die richtige Antwort ist , dass Sie Ihre Passwörter nicht in die Befehlszeile eingeben, damit jeder, der Zugriff darauf hat, /procsie trivial lesen kann, solange das Programm ausgeführt wird . Das ist, was ~/.my.cnfist für, richtig auf 0600
Shadur

Antworten:

25

Sie müssen sehr vorsichtig sein, wie Sie Passwörter an Befehlszeilen übergeben, da Sie, wenn Sie nicht vorsichtig sind, diese mit Tools wie z ps.


Am sichersten ist es, eine neue Konfigurationsdatei zu erstellen und diese mysqlmit der Befehlszeilenoption --defaults-file=oder an diese zu übergeben --defaults-extra-file=.

Der Unterschied zwischen den beiden besteht darin, dass die letztere zusätzlich zu den Standardkonfigurationsdateien gelesen wird, wohingegen bei der ersteren nur die als Argument übergebene Datei verwendet wird.

Ihre zusätzliche Konfigurationsdatei sollte Folgendes enthalten:

[client]
user=foo
password=P@55w0rd

Stellen Sie sicher, dass Sie diese Datei sichern.

Dann renne:

mysql --defaults-extra-file=<path to the new config file> [all my other options]
garethTheRed
quelle
2
MySQL ändert argves, um die dem -pFlag zugewiesenen Parameter zu überschreiben . Zumindest ist dies hier zusammen mit anderen relevanten Informationen der Fall
Kusalananda
Dies ist die beste Lösung, da sie ein gewisses Maß an Sicherheit bietet. Sie müssen go-rwx chmod und sicherstellen, dass dieses Argument vor allen anderen Argumenten steht.
ChuckCottrill
1
@Kusalananda, ja, aber wie pro Kommentar zu unix.stackexchange.com/q/385339/135943 , das nicht bedeutet , es ist sicher!
Wildcard
Könnte es wert sein, eine Notiz darüber hinzuzufügen, --login-pathdass es jetzt unterstützt wird. Es ist nicht viel besser als das, aber es ist etwas weniger Klartext (obwohl die Barriere für die Konvertierung des Inhalts in Klartext gering ist).
Geoffrey Wiseman
6
Setzen Sie MYSQL_PWD in der Umgebung ( export MYSQL_PWD=muhpassword) und führen Sie Ihren Befehl ohne das aus -p. Siehe MySQL-Programmumgebungsvariablen . Trotz der grässlichen Warnungen des Handbuchs ist dies ziemlich sicher . Es sei denn, Sie starten später seltsame Warez in der gleichen Shell. Also laufen wir:MYSQL_PWD=$(cat foo.php etc) mysql -u foouser -h barhost
David Tonhofer
12

Das mysqlClient-Dienstprogramm kann in der Befehlszeile ein Kennwort mit den Optionen -poder eingeben --password=.

Wenn Sie verwenden -p, darf nach dem Optionsbuchstaben kein Leerzeichen stehen:

$ mysql -pmypassword

Ich bevorzuge die langen Optionen in Skripten, da sie sich selbst dokumentieren:

mysql --password=mypassword --user=me --host=etc
Kusalananda
quelle
3
Dies ist unsicher, da jeder Benutzer das Kennwort anzeigen kann - entweder direkt über /proc/$pid/cmdlineoder über den psBefehl. Es ist wahr, dass mysql das Passwort beim Start in argv überschreibt, aber es gibt immer ein Zeitfenster, in dem ein anderer Benutzer das Passwort beobachten kann. Auf einigen Systemen funktioniert das argv-Überschreiben möglicherweise nicht.
Maxschlepzig
3

Wenn Sie mysqlmit einem Passwort beginnen möchten, müssen Sie das Passwort zuerst in einer Variablen abrufen:

MYSQLPASS=`cat foo.php | grep '$dbpwd=' | cut -d '"' -f 2`

Dann können Sie Ihren mysqlBefehl starten mit:

mysql -U root -p ${MYSQLPASS} mydb -h friendserver
Lambert
quelle
1
Dies gefährdet auch Ihre Passwortsicherheit . Beachten Sie, dass es die MYSQL_PWDUmgebungsvariable gibt, von der gelesen wirdmysql wenn Sie nichts angeben -p. Und unter Linux ist dies eine sichere Methode, da die Umgebung eines Benutzers - im Gegensatz zum Argument vector - nicht von anderen, nicht qualifizierten Benutzern gelesen werden kann.
Maxschlepzig