Als ich versuchte, den folgenden Befehl unter MySQL in Terminal auszuführen:
mysql -u $user -p$password -e "statement"
Die Ausführung funktioniert wie erwartet, gibt jedoch immer eine Warnung aus:
Warnung: Die Verwendung eines Kennworts auf der Befehlszeilenschnittstelle kann unsicher sein.
Ich muss die obige Anweisung jedoch mit einer Umgebungsvariablen ( $password
) ausführen, in der mein Kennwort gespeichert ist, da ich den Befehl iterativ im Bash-Skript von Terminal aus ausführen möchte und die Idee, auf eine Eingabeaufforderung zu warten, definitiv nicht mag und zwinge mich, mein Passwort 50 oder 100 Mal in einem einzigen Skript einzugeben. Hier ist meine Frage:
Ist es möglich, die Warnung zu unterdrücken? Der Befehl funktioniert wie angegeben ordnungsgemäß, aber das Fenster wird ziemlich chaotisch, wenn ich den Befehl 50 oder 100 Mal durchlaufe und ausführe.
Sollte ich der Warnmeldung folgen und mein Passwort NICHT in mein Skript schreiben? Wenn dies der Fall ist, muss ich dann jedes Mal mein Passwort eingeben, wenn mich die Eingabeaufforderung dazu zwingt?
Laufen man mysql
hilft nicht, nur zu sagen
--show-warnings
Verursachen Sie, dass nach jeder Anweisung Warnungen angezeigt werden, falls vorhanden. Diese Option gilt für den interaktiven Modus und den Stapelmodus.
und erwähnt nichts darüber, wie man die Funktionalität ausschaltet, wenn mir etwas nicht fehlt.
Ich bin auf OS X 10.9.1 Mavericks und benutze MySQL 5.6 von Homebrew.
[client]
password=my_password
in~/.my.cnf
). Sicherlich hat es auch einige Auswirkungen auf die Sicherheit, aber zumindest ist es für niemanden zugänglich , der es ausführen kannps
, und Sie haben die Kontrolle darüber mit Dateiberechtigungen.mysql -u root password root -e "statement" > /dev/null
?pexcept
. Es kann Terminal-Einfügungen durchführen und auch Rückmeldungen verarbeiten, die der Befehl gibt. Auf diese Weise können Sie einfach die ausführliche Ausgabe und den Streifen der tatsächlichen Ausgabe überspringen, die Sie möchten :)Antworten:
Wenn Ihre MySQL-Client / Server-Version eine 5.6.xa-Methode zur Vermeidung der WARNING-Meldung ist, verwenden Sie die Tools mysql_config_editor :
Dann können Sie in Ihrem Shell-Skript Folgendes verwenden:
Anstatt:
quelle
--login-path
vor allen anderen Argumenten kommen muss. Ich habe versuchtmysqldump --tables --login-path=local
, den Fehler zu bekommenunknown variable 'login-path=local'
.Ich benutze so etwas wie:
oder
Wo config.cnf enthält:
Auf diese Weise können Sie mehrere Konfigurationsdateien haben - für verschiedene Server / Rollen / Datenbanken. Wenn Sie ~ / .my.cnf verwenden, können Sie nur einen Konfigurationssatz festlegen (obwohl dies möglicherweise ein nützlicher Satz von Standardeinstellungen ist).
Wenn Sie in einer Debian-basierten Distribution arbeiten und als Root ausgeführt werden, können Sie die obigen Schritte überspringen und einfach /etc/mysql/debian.cnf verwenden, um in ...:
mysql --defaults-extra-file=/etc/mysql/debian.cnf
quelle
--defaults-extra-file
Muss die erste Option sein, sonst beschwert sich MySQLmysqldump: unknown variable 'defaults-extra-file
.MYSQL_PWD
Variable auf keinen Fall ...mysql --defaults-extra-file=<(printf "[client]\nuser = %s\npassword = %s" "$user" "$pwd") -e "statement"
. Da dasprintf
von Bash direkt ausgeführt wird, wird es nicht in angezeigtps
.--defaults-file
eher verwenden als--defaults-extra-file
, weil letztere die Einstellungen in ~ / .my.cnf bevorzugten.Eine bequeme (aber ebenso unsichere) Methode ist die Verwendung von:
Beachten Sie, dass die offiziellen Dokumente dagegen empfehlen.
Siehe 6.1.2.1 Endbenutzerrichtlinien für die Kennwortsicherheit (MySQL-Handbuch für Version 5.6) :
quelle
Access denied for user 'root'@'localhost' (using password: NO)
export MYSQL_PWD=whatever
.export
, platzieren Sie einfach alles in einer Zeile:MYSQL_PWD=xxxxxxxx mysql -u root -e "statement"
Wenn Sie ein Kennwort in der Befehlszeile verwenden möchten, funktioniert dies zum Herausfiltern der spezifischen Fehlermeldung:
Grundsätzlich wird der Standardfehler auf die Standardausgabe umgeleitet - und mit grep werden alle Zeilen gelöscht, die mit "Warnung: Verwenden eines Kennworts" übereinstimmen.
Auf diese Weise können Sie jede andere Ausgabe sehen, einschließlich Fehler. Ich benutze dies für verschiedene Shell-Skripte usw.
quelle
So habe ich mein Bash-Skript für meine täglichen mysqldump-Datenbanksicherungen erhalten, damit sie sicherer funktionieren. Dies ist eine Erweiterung der großartigen Antwort von Cristian Porta.
Verwenden Sie zuerst mysql_config_editor (im Lieferumfang von mysql 5.6+ enthalten ), um die verschlüsselte Kennwortdatei einzurichten. Angenommen, Ihr Benutzername lautet "db_user". Ausführen von der Shell-Eingabeaufforderung:
Es fordert zur Eingabe des Passworts auf. Sobald Sie es eingegeben haben, werden der Benutzer / Pass verschlüsselt in Ihrem gespeichert
home/system_username/.mylogin.cnf
Ändern Sie "system_username" natürlich in Ihren Benutzernamen auf dem Server.
Ändern Sie Ihr Bash-Skript folgendermaßen:
dazu:
Keine exponierten Passwörter mehr.
quelle
Der einfachste Weg ist
quelle
2>/dev/null | grep -v "mysql: [Warning] Using a password on the command line interface can be insecure."
, um nur die betreffende Warnung zu unterdrückenSie können auch den mysql_config_editor in Ihrem Skript ausführen, um das Kennwort bei der Angabe des Anmeldepfads zu übergeben
Dadurch wird eine Erwartungssitzung gestartet, die in Skripten zur Interaktion mit Eingabeaufforderungen verwendet werden kann
Siehe diesen Beitrag
quelle
ok, Lösung ohne temporäre Dateien oder irgendetwas:
Es ähnelt dem, was andere erwähnt haben, aber hier benötigen Sie keine tatsächliche Datei. Dieser Teil des Befehls fälscht die Datei:
<(echo ...)
(Beachten Sie, dass in der Mitte kein Leerzeichen vorhanden ist<(
quelle
.my.cnf
Datei~/.
mit einem Passworteintrag in IhremVerwenden Sie den Befehl print, um zu sehen, was mysql_config_editor in die Datei .mylogin.cnf geschrieben hat:
Der Befehl print zeigt jeden Anmeldepfad als eine Reihe von Zeilen an, die mit einer Gruppenüberschrift beginnen, die den Namen des Anmeldepfads in eckigen Klammern angibt, gefolgt von den Optionswerten für den Anmeldepfad. Kennwortwerte sind maskiert und werden nicht als Klartext angezeigt.
Wie in den vorhergehenden Beispielen gezeigt, kann die Datei .mylogin.cnf mehrere Anmeldepfade enthalten. Auf diese Weise erleichtert mysql_config_editor das Einrichten mehrerer „Persönlichkeiten“ für die Verbindung mit verschiedenen MySQL-Servern. Jedes dieser Elemente kann später mit der Option --login-path nach Namen ausgewählt werden, wenn Sie ein Client-Programm aufrufen. Verwenden Sie beispielsweise den folgenden Befehl, um eine Verbindung zum lokalen Server herzustellen:
Verwenden Sie diesen Befehl, um eine Verbindung zum Remote-Server herzustellen:
quelle
Von https://gist.github.com/nestoru/4f684f206c399894952d
quelle
Eine andere Alternative ist die Verwendung von sshpass zum Aufrufen von MySQL, z.
quelle
Ein einfaches Workaroud-Skript. Nennen Sie dieses "MySQL" und setzen Sie es in Ihren Pfad vor "/ usr / bin". Offensichtliche Varianten für andere Befehle oder wenn der Warnungstext anders ist.
quelle
Hier ist eine Lösung für Docker in einem Skript / bin / sh:
Ersetzen Sie [MYSQL_CONTAINER_NAME] und stellen Sie sicher, dass die Umgebungsvariable MYSQL_ROOT_PASSWORD in Ihrem Container festgelegt ist.
Hoffe es wird dir helfen wie es mir helfen könnte!
quelle
docker exec [MYSQL_CONTAINER_NAME] sh -c 'exec echo "[client] [RETURN HERE] password=pa55" > /root/defaults'
unter Verwendung der--defaults-file
bereits Wurzel zu aufgreift.Sie können die STDERR-Ausgabe des Standardfehlers auch einfach nach / dev / null umleiten
Also mach einfach:
mysql -u $user -p$password -e "statement" 2> /dev/null
quelle
Persönlich verwende ich Script Wrapper, um diesen Fehler abzufangen. Hier ist ein Codebeispiel:
quelle
Für PowerShell (
pwsh
nichtbash
) war dies eine ziemliche Rube-Goldberg-Lösung ... Mein erster Versuch bestand darin, die Aufrufemysql
in einetry/catch
Funktion zu packen , jedoch aufgrund eines merkwürdigen Verhaltens bei der PowerShell-Fehlerbehandlung war dies nicht realisierbar.Die Lösung war , die außer Kraft zu setzen
$ErrorActionPreference
gerade lang genug und zu kombinieren ErfassungSTDERR
undSTDOUT
und Parst für das WortERROR
und Wiederwurf nach Bedarf. Der Grund, warum wir nicht abfangen und freigeben konnten,"^mysql.*Warning.*password"
ist, dass PowerShell den Fehler als einen Stream behandelt und auslöst. Sie müssen also alles erfassen, um zu filtern und erneut zu werfen. : /Hinweis: PowerShell ist für Unix verfügbar, daher ist diese Lösung plattformübergreifend. Es kann
bash
mit einigen geringfügigen Änderungen der Syntax angepasst werden .Warnung: Es gibt Dutzende von Randfällen, in denen dies nicht funktioniert, z. B. nicht englische Fehlermeldungen oder Anweisungen, die das Wort an einer
ERROR
beliebigen Stelle in der Ausgabe zurückgeben. Es hat jedoch ausgereicht, die Warnung für einen einfachen Aufruf an zu verschluckenmysql
ohne die zu bombardieren gesamtes Skript. Hoffentlich finden andere das nützlich.Es wäre schön, wenn Sie
mysql
einfach eine Option hinzufügen würden, um diese Warnung zu unterdrücken.quelle
Wenn Sie Rundeck zum Planen Ihrer Aufgaben oder auf einer anderen Plattform verwenden, auf der Sie nach einer
mylogin.cnf
Datei fragen , habe ich den folgenden Shell-Code erfolgreich verwendet, um einen neuen Speicherort für die Datei bereitzustellen, bevor Sie mit SQL-Aufrufen fortfahren:Wo
MYSQL_TEST_LOGIN_FILE
ist eine Umgebungsvariable, die auf einen anderen Dateipfad als den Standardpfad festgelegt werden kann?Dies ist besonders nützlich, wenn Sie in einem gegabelten Prozess ausgeführt werden und keine Dateien in das
$HOME
Verzeichnis verschieben oder kopieren können .Siehe Dokumentation hier.
quelle
Die beste Lösung ist die Verwendung eines Alias:
Fügen Sie dies beispielsweise in Ihr Skript ein:
dann später in Ihrem Skript, um eine Datenbank zu laden:
um eine Anweisung auszuführen:
quelle
Definieren Sie den Helfer:
Benutze es:
Tachaan! Ihr Code ist sauber und schön zu lesen
(getestet mit Bash)
quelle
Eine andere Lösung (zum Beispiel aus einem Skript):
Die
-i''
Option ist hier für die Kompatibilität mit Mac OS X vorgesehen. Standard-UNIX-Betriebssysteme können direkt verwendet werden-i
quelle
Das Problem, das ich hatte, war die Verwendung der Ausgabe in einer Bedingung in einem Bash-Skript.
Dies ist nicht elegant, aber in einer Docker-Umgebung sollte dies wirklich keine Rolle spielen. Grundsätzlich ignoriert dies nur die Ausgabe, die nicht in der letzten Zeile steht. Mit awk können Sie ähnliche Aktionen ausführen und alle bis auf die erste Zeile usw. zurückgeben.
Dies gibt nur die letzte Zeile zurück
Der Fehler wird nicht unterdrückt, es wird jedoch sichergestellt, dass Sie die Ausgabe einer Abfrage in einem Bash-Skript verwenden können.
quelle
Der einfachste Weg:
Geben Sie dies ein und Sie müssen Ihr Passwort eingeben.
Hinweis: Ja, ohne Semikolon.
quelle
Sie können mySQL ausführen und Warn- und Fehlermeldungen unterdrücken, indem Sie beispielsweise / dev / null verwenden:
Wo:
genießen!
quelle
Es hat bei mir funktioniert - Nur
2> null
nach dem hinzugefügt$(mysql_command)
, und es werden nur die Fehler- und Warnmeldungen unterdrückt.quelle
2>/dev/null
. Mit using wird2> null
die Ausgabe nur in eine Datei mit dem Namen "null" im aktuellen Verzeichnis gestellt.