Unterdrücken Sie Warnmeldungen mit MySQL aus dem Terminal heraus, aber das Passwort wurde im Bash-Skript geschrieben

273

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 mysqlhilft 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.

Blaszard
quelle
14
Die empfohlene Methode besteht darin, Ihr Passwort in einer Optionsdatei zu speichern (smth wie [client] password=my_passwordin ~/.my.cnf). Sicherlich hat es auch einige Auswirkungen auf die Sicherheit, aber zumindest ist es für niemanden zugänglich , der es ausführen kann ps, und Sie haben die Kontrolle darüber mit Dateiberechtigungen.
Anton Kovalenko
4
mysql -u root password root -e "statement" > /dev/null?
Übrigens können Sie auch so etwas wie Python verwenden 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 :)
6
Die empfohlene Art und Weise, wie IMO diejenigen bestraft, die das Richtige tun, um diejenigen zu schützen, die das Falsche tun. Wenn das Kennwort in einer Skriptdatei gespeichert ist, wird es nicht mit ps oder in einem Protokoll angezeigt. Das ist der richtige Weg, dies zu tun. Das Einfügen der Datei in eine externe Datei hilft denjenigen, die das Kennwort erstellen würden, aber das ist anfangs schlecht. In der Zwischenzeit schlagen Skripte, die seit Jahren ausgeführt werden, fehl und wir müssen sie ändern, nur weil diese Warnung im stderr angezeigt wird.
Nestor Urquiza
2
Die empfohlene Methode, bei der das Kennwort nicht im Klartext gespeichert
Anthony

Antworten:

249

Wenn Ihre MySQL-Client / Server-Version eine 5.6.xa-Methode zur Vermeidung der WARNING-Meldung ist, verwenden Sie die Tools mysql_config_editor :

mysql_config_editor set --login-path=local --host=localhost --user=username --password

Dann können Sie in Ihrem Shell-Skript Folgendes verwenden:

mysql --login-path=local  -e "statement"

Anstatt:

mysql -u username -p pass -e "statement"
Cristian Porta
quelle
28
Denken Sie daran, dass das --login-pathvor allen anderen Argumenten kommen muss. Ich habe versucht mysqldump --tables --login-path=local, den Fehler zu bekommen unknown variable 'login-path=local'.
Tulio
Der MySQL-Befehlszeilenclient wird standardmäßig unter dem Anmeldepfad 'client' angezeigt. Sie können die Anweisungen zu "mysql -e 'Anweisung'" vereinfachen, indem Sie eine kleine Änderung vornehmen.
Morgan Tocker
2
Dies funktioniert gut, wenn wir die Shell-Datei direkt ausführen, aber nicht, wenn von crontab aufgerufen
Nabeel Arshad
1
@NabeelArshad Ich denke, das liegt daran, dass in Ihrer Crontab das "Zuhause" für den Benutzer nicht festgelegt ist (ENV-Variablen im Allgemeinen), sodass der Client in der Crontab nicht die richtige ~ / .mylogin.cnf
Cristian Porta
1
@NamGVU, ich bin mir nicht sicher, aber ich glaube, dass diese Lösung verschlüsselte Passwörter speichert.
Zhekaus
209

Ich benutze so etwas wie:

mysql --defaults-extra-file=/path/to/config.cnf

oder

mysqldump --defaults-extra-file=/path/to/config.cnf 

Wo config.cnf enthält:

[client]
user = whatever
password = whatever
host = whatever

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

David Goodwin
quelle
12
Hinweis: --defaults-extra-fileMuss die erste Option sein, sonst beschwert sich MySQL mysqldump: unknown variable 'defaults-extra-file.
Pevik
4
Tolle Alternative zur akzeptierten Antwort. Setzen Sie die MYSQL_PWDVariable auf keinen Fall ...
DudeOnRock
1
Auf jeden Fall eine gute Option für Versionen unter 5.6. Ansonsten würde ich mit der akzeptierten Antwort gehen.
dkniffin
21
Eine Alternative zum Erstellen einer temporären .cnf-Datei besteht darin, dies in Bash zu tun : mysql --defaults-extra-file=<(printf "[client]\nuser = %s\npassword = %s" "$user" "$pwd") -e "statement". Da das printfvon Bash direkt ausgeführt wird, wird es nicht in angezeigt ps.
Dave James Miller
3
Ich musste --defaults-fileeher verwenden als --defaults-extra-file, weil letztere die Einstellungen in ~ / .my.cnf bevorzugten.
Roger Dueck
185

Eine bequeme (aber ebenso unsichere) Methode ist die Verwendung von:

MYSQL_PWD=xxxxxxxx mysql -u root -e "statement"

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) :

Speichern Sie Ihr Passwort in der MYSQL_PWDUmgebungsvariablen

Diese Methode zur Angabe Ihres MySQL-Passworts muss als äußerst unsicher angesehen werden und sollte nicht verwendet werden. Einige Versionen von ps enthalten eine Option zum Anzeigen der Umgebung laufender Prozesse. Wenn Sie auf einigen Systemen festlegen MYSQL_PWD, wird Ihr Kennwort jedem anderen Benutzer angezeigt , der ps ausführt . Selbst auf Systemen ohne eine solche Version von ps ist es unklug anzunehmen, dass es keine anderen Methoden gibt, mit denen Benutzer Prozessumgebungen untersuchen können.

Ivan Dokov
quelle
6
Dies funktioniert nicht in meinem Bash-Skript:Access denied for user 'root'@'localhost' (using password: NO)
rubo77
24
In einem Skript müssen Sie export MYSQL_PWD=whatever.
Aufstand
2
Da meine Anfrage sehr schnell ist, habe ich mich für diese Option entschieden. Dann habe ich es nach dem Ausführen der Abfrage auf etwas Falsches gesetzt.
TimH - Codidact
11
In einem Skript, das Sie nicht ausführen müssen export, platzieren Sie einfach alles in einer Zeile:MYSQL_PWD=xxxxxxxx mysql -u root -e "statement"
JD
1
@JD: funktioniert für mich in Ubuntu 16.04 mit MySQL 5.7.21.
Mivk
70

Wenn Sie ein Kennwort in der Befehlszeile verwenden möchten, funktioniert dies zum Herausfiltern der spezifischen Fehlermeldung:

mysqlcommand 2>&1 | grep -v "Warning: Using a password"

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.

Johnmontfx
quelle
Dies ist eine hervorragende Lösung für die Verwendung in Einzeileraufgaben, die in anderen Aufgaben aufgerufen werden, z. B. beim Erstellen einer Rechenaufgabe für eine Capistrano-Bereitstellung.
JakeGould
2
Hervorragend und einfach, um diese Nachricht stummzuschalten. Sie müssen im MySQL-Setup nichts berühren.
Ajaaskel
Wie würde ich dies mit mysqldump verwenden, wo ich bereits eine Umleitung für SQL habe?
MacroMan
1
Dies ist eine wirklich schlechte Lösung im Vergleich zu den anderen hier. Es kann bei jeder nachfolgenden Version von MySQL fehlschlagen, falls sich der Text ändert, und funktioniert möglicherweise auch nicht in einem anderen Gebietsschema.
Yktoo
42

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.

  1. 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:

    mysql_config_editor set --login-path=local --host=localhost --user=db_user --password

    Es fordert zur Eingabe des Passworts auf. Sobald Sie es eingegeben haben, werden der Benutzer / Pass verschlüsselt in Ihrem gespeicherthome/system_username/.mylogin.cnf

    Ändern Sie "system_username" natürlich in Ihren Benutzernamen auf dem Server.

  2. Ändern Sie Ihr Bash-Skript folgendermaßen:

    mysqldump -u db_user -pInsecurePassword my_database | gzip > db_backup.tar.gz

    dazu:

    mysqldump --login-path=local my_database | gzip > db_backup.tar.gz

Keine exponierten Passwörter mehr.

Buttle Butkus
quelle
10

Der einfachste Weg ist

mysql -u root -pMYPASSWORD -e "show databases" 2>/dev/null
JavaGuy
quelle
43
Das Problem ist, dass dadurch auch legitime Fehler in Ihrem Skript unterdrückt werden.
man910
4
Sie können auch eine Protokolldatei 2> /var/log/myscript.log erstellen, um diese Fehler zu protokollieren.
Skamasle
1
Verwenden Sie 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ücken
Hafenkranich
10

Sie können auch den mysql_config_editor in Ihrem Skript ausführen, um das Kennwort bei der Angabe des Anmeldepfads zu übergeben

expect -c "
spawn mysql_config_editor set --login-path=$mySqlUser --host=localhost --user=$mySqlUser --password
expect -nocase \"Enter password:\" {send \"$mySqlPassword\r\"; interact}
"

Dadurch wird eine Erwartungssitzung gestartet, die in Skripten zur Interaktion mit Eingabeaufforderungen verwendet werden kann

Siehe diesen Beitrag

Phylanx
quelle
Soll das '>' wirklich da sein?
David Goodwin
yes '>' soll dort sein, damit mysql_config_editor Eingaben von stdout entgegennimmt. Was von stdout an mysql_config_editor übergeben wird, ist das Passwort, das dieser Benutzer haben soll. Ohne das '>' wird der Echo-Befehl analysiert und alles, was Sie sehen würden, ist alles nach dem Echo-Befehl
Phylanx
Sie wollen also den Pipe-Operator "|" verwenden, oder? Zumindest in * nix und DOS erfasst ">" das STDOUT und schreibt es in eine Datei namens "mysql_config_editor" im aktuellen Arbeitsverzeichnis.
Jay Dansand
Ja, Sie haben
Recht
7

ok, Lösung ohne temporäre Dateien oder irgendetwas:

mysql --defaults-extra-file=<(echo $'[client]\npassword='"$password") -u $user -e "statement"

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<(

santiago arizti
quelle
Dies funktioniert nicht, wenn Sie bereits eine .my.cnfDatei ~/.mit einem Passworteintrag in Ihrem
Konto haben
5
shell> mysql_config_editor set --login-path=local
     --host=localhost --user=localuser --password
Enter password: enter password "localpass" here
shell> mysql_config_editor set --login-path=remote
     --host=remote.example.com --user=remoteuser --password
Enter password: enter password "remotepass" here

Verwenden Sie den Befehl print, um zu sehen, was mysql_config_editor in die Datei .mylogin.cnf geschrieben hat:

shell> mysql_config_editor print --all
[local]
user = localuser
password = *****
host = localhost
[remote]
user = remoteuser
password = *****
host = remote.example.com

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:

shell> mysql --login-path=local

Verwenden Sie diesen Befehl, um eine Verbindung zum Remote-Server herzustellen:

shell> mysql --login-path=remote
Beta
quelle
Was ist, wenn ich einen Befehl mysqldump als Benutzer von www-data ausführen möchte? www-data hat kein Home-Verzeichnis ... wie richte ich den mysql_config_editor für www-data-Benutzer ein?
Lewis4u
5

Von https://gist.github.com/nestoru/4f684f206c399894952d

# Let us consider the following typical mysql backup script:
mysqldump --routines --no-data -h $mysqlHost -P $mysqlPort -u $mysqlUser -p$mysqlPassword $database

# It succeeds but stderr will get:
# Warning: Using a password on the command line interface can be insecure.
# You can fix this with the below hack:
credentialsFile=/mysql-credentials.cnf
echo "[client]" > $credentialsFile
echo "user=$mysqlUser" >> $credentialsFile
echo "password=$mysqlPassword" >> $credentialsFile
echo "host=$mysqlHost" >> $credentialsFile
mysqldump --defaults-extra-file=$credentialsFile --routines --no-data $database

# This should not be IMO an error. It is just a 'considered best practice'
# Read more from http://thinkinginsoftware.blogspot.com/2015/10/solution-for-mysql-warning-using.html
Nestor Urquiza
quelle
3

Eine andere Alternative ist die Verwendung von sshpass zum Aufrufen von MySQL, z.

sshpass -p topsecret mysql -u root -p username -e 'statement'
Lewis
quelle
Scheint zu funktionieren, aber Sie müssen 'Benutzername' von der Kommandozeile entfernen, nicht wahr?
e2-e4
3

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.

#!/bin/sh

(
(
(
(
(
    /usr/bin/mysql "$@"
) 1>&9 
) 2>&1
) | fgrep -v 'mysql: [Warning] Using a password on the command line interface can be insecure.'
) 1>&2 
) 9>&1
David G.
quelle
3
Obwohl diese Antwort ein wenig verworren ist, habe ich sie nur positiv bewertet, weil es mich so scheiße macht, Antworten zu sehen, die nicht explizit falsch sind oder ein wenig unkonventionell sind, wenn ich ohne Kommentare Abstimmungen bekomme! Kein Wunder, dass David keine weiteren Fragen beantwortet hat! Er sprang ein und versuchte mit einer neuartigen Lösung zu helfen und wurde ohne Erklärung dafür zugeschlagen, warum! FU anonyme Downvoter, die keine Kommentare hinterlassen!
Jeremy Davis
3
+1 stimme Jeremy Davis zu. Dies ist kompliziert, aber wenn keine andere Option übrig bleibt, kann dies akzeptabel sein. Es ist definitiv nicht falsch, im Gegensatz zum Ausschalten von Warnungen, was die dümmste Idee überhaupt sein muss!
Ben McIntyre
1
@JeremyDavis Ja, das war verworren, hauptsächlich weil ich die Arbeit zeigen wollte. Es könnte möglicherweise ohne Klammern geschehen, wäre aber möglicherweise weniger klar gewesen. Dies war auch meine erste nicht lesende Aktivität im gesamten Stapelaustausch ... danach habe ich sie lange nicht mehr angefasst. Ihr Kommentar wurde auf jeden Fall geschätzt.
David G.
@ DavidG. - Ich bin froh, dass mein Kommentar für Sie von Wert war. Es ist auch toll zu sehen, dass Sie zurück sind und Ihre Antwort jetzt im positiven Bereich liegt. Persönlich denke ich nicht, dass Abstimmungen ohne Kommentare erlaubt sein sollten ... Wie soll jemand lernen, wenn er für einen Versuch verprügelt wird?!
Jeremy Davis
Wenn ich Ihre Antwort noch einmal betrachte, bin ich nicht davon überzeugt, dass eine dauerhafte Lösung (im Wesentlichen das Umschließen von MySQL) für ein temporäres Problem (Unterdrücken einer Fehlermeldung zur Verwendung in einem einzelnen Skript) der beste Weg ist. IMO das Einschließen von MySQL in eine Funktion innerhalb des Skripts (die Verwendung Ihrer Methode hier wäre in Ordnung) ist ein überlegener Ansatz. Mein 2c ... :)
Jeremy Davis
3

Hier ist eine Lösung für Docker in einem Skript / bin / sh:

docker exec [MYSQL_CONTAINER_NAME] sh -c 'exec echo "[client]"> /root/mysql-credentials.cnf'

docker exec [MYSQL_CONTAINER_NAME] sh -c 'exec echo "user = root" >> /root/mysql-credentials.cnf'

docker exec [MYSQL_CONTAINER_NAME] sh -c 'exec echo "password = $ MYSQL_ROOT_PASSWORD" >> /root/mysql-credentials.cnf'

docker exec [MYSQL_CONTAINER_NAME] sh -c 'exec mysqldump --defaults-extra-file = / root / mysql-credentials.cnf --all-database'

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!

pcmanprogrammeur
quelle
Nicht schlecht. Ich habe gerade einen Anruf mit einer Rückkehr in, zum Beispiel docker exec [MYSQL_CONTAINER_NAME] sh -c 'exec echo "[client] [RETURN HERE] password=pa55" > /root/defaults'unter Verwendung der --defaults-filebereits Wurzel zu aufgreift.
Matthew Wilcoxson
3

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

Joseph Shih
quelle
7
Ich würde diese Methode vermeiden, da dies das Auffinden legitimer Fehler erschweren würde
Vladimir Hraban
1

Persönlich verwende ich Script Wrapper, um diesen Fehler abzufangen. Hier ist ein Codebeispiel:

#!/bin/bash

#echo $@ | cat >> /home/mysqldump.log 2>/dev/null
ERR_FILE=/tmp/tmp_mdump.err

# Execute dumper
/usr/bin/mysqldump $@ 2>$ERR_FILE

# Determine error and remove tmp file
ERROR=`cat $ERR_FILE`
rm $ERR_FILE

# Handle an error
if [ "" != "$ERROR" ]; then

        # Error occured
        if [ "Warning: Using a password on the command line interface can be insecure." != "$ERROR" ]; then
                echo $ERROR >&2
                exit 1
        fi
fi
Und
quelle
1

Für PowerShell ( pwshnicht bash) war dies eine ziemliche Rube-Goldberg-Lösung ... Mein erster Versuch bestand darin, die Aufrufe mysqlin eine try/catchFunktion 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 $ErrorActionPreferencegerade lang genug und zu kombinieren Erfassung STDERRund STDOUTund Parst für das Wort ERRORund 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. : /

Function CallMySQL() {
    # Cache the error action preference
    $_temp = $ErrorActionPreference
    $ErrorActionPreference = "Continue"

    # Capture all output from mysql
    $output = (&mysql --user=foo --password=bar 2>&1)

    # Restore the error action preference
    $ErrorActionPreference = $_temp

    if ($output -match "ERROR") {
        throw $output
    } elseif($output) {
        "   Swallowing $output"
    } else {
        "   No output"
    }
}

Hinweis: PowerShell ist für Unix verfügbar, daher ist diese Lösung plattformübergreifend. Es kann bashmit 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 ERRORbeliebigen 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 mysqleinfach eine Option hinzufügen würden, um diese Warnung zu unterdrücken.

tresf
quelle
1

Wenn Sie Rundeck zum Planen Ihrer Aufgaben oder auf einer anderen Plattform verwenden, auf der Sie nach einer mylogin.cnfDatei fragen , habe ich den folgenden Shell-Code erfolgreich verwendet, um einen neuen Speicherort für die Datei bereitzustellen, bevor Sie mit SQL-Aufrufen fortfahren:

if test -f "$CUSTOM_MY_LOGINS_FILE_PATH"; then
   chmod 600 $CUSTOM_MY_LOGINS_FILE_PATH
   export MYSQL_TEST_LOGIN_FILE="$CUSTOM_MY_LOGINS_FILE_PATH"
fi

...

result=$(mysql --login-path=production -NBA -D $schema -e "$query")

Wo MYSQL_TEST_LOGIN_FILEist 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 $HOMEVerzeichnis verschieben oder kopieren können .

Siehe Dokumentation hier.

Patrick.SE
quelle
0

Die beste Lösung ist die Verwendung eines Alias:

alias [yourapp]-mysql="mysql -u root -psomepassword -P3306 -h 127.0.0.1"

Fügen Sie dies beispielsweise in Ihr Skript ein:

alias drupal-mysql="mysql -u root -psomepassword -P3306 -h 127.0.0.1"

dann später in Ihrem Skript, um eine Datenbank zu laden:

drupal-mysql database_name < database_dump.sql

um eine Anweisung auszuführen:

drupal-mysql -e "EXEC SOMESTATEMENT;"
Neil Davis
quelle
dann unalias die aliaas:
Neil Davis
Zu Ihrer Information, Sie können keinen Alias ​​verwenden, wenn Sie MySQL innerhalb einer Funktion innerhalb des Skripts aufrufen.
user3616725
0

Definieren Sie den Helfer:

remove-warning () {
    grep -v 'mysql: [Warning] Using a password on the command line interface can be insecure.'
}

Benutze es:

mysql -u $user -p$password -e "statement" 2>&1 | remove-warning

Tachaan! Ihr Code ist sauber und schön zu lesen

(getestet mit Bash)

volingas
quelle
-1

Eine andere Lösung (zum Beispiel aus einem Skript):

 sed -i'' -e "s/password=.*\$/password=$pass/g" ~/.my.cnf
 mysql -h $host -u $user $db_name -e "$sql_cmd"

Die -i''Option ist hier für die Kompatibilität mit Mac OS X vorgesehen. Standard-UNIX-Betriebssysteme können direkt verwendet werden-i

Benoit Duffez
quelle
1
Das Passwort befindet sich immer noch in der Befehlszeile des 'sed' und bleibt daher in Prozesslisten sichtbar, auch wenn dies nur kurz ist.
Anthony
-1

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

mysql -u db_user -pInsecurePassword my_database ... | sed -e '$!d'

Der Fehler wird nicht unterdrückt, es wird jedoch sichergestellt, dass Sie die Ausgabe einer Abfrage in einem Bash-Skript verwenden können.

WiR3D
quelle
-1

Der einfachste Weg:

mysql -u root -p YOUR_DATABASE

Geben Sie dies ein und Sie müssen Ihr Passwort eingeben.

Hinweis: Ja, ohne Semikolon.

LukasNiessen
quelle
-3

Sie können mySQL ausführen und Warn- und Fehlermeldungen unterdrücken, indem Sie beispielsweise / dev / null verwenden:

# if you run just a SQL-command
mysql -u ${USERNAME} -p${PASSWORD} -h ${HOST} ${DATABASE} -e "${STATEMENT}" &> /dev/null

# Or you can run SQL-script as a file
mysql -u ${USERNAME} -p${PASSWORD} -h ${HOST} ${DATABASE} < ${FILEPATH} &> /dev/null

Wo:

${USERNAME} - existing mysql user

${PASSWORD} - password

${HOST}     - ip or hostname, for example 'localhost'

${DATABASE} - name of database

${STATEMENT}- SQL command

${FILEPATH} - Path to the SQL-script

genießen!

Stan Khalipa
quelle
1
Beachten Sie jedoch, dass ALLE Fehlermeldungen unterdrückt werden, nicht nur diese Kennwortwarnungen.
Simon East
-3

Es hat bei mir funktioniert - Nur 2> nullnach dem hinzugefügt $(mysql_command), und es werden nur die Fehler- und Warnmeldungen unterdrückt.

MMG
quelle
1
Das bedeutet auch, dass Sie keinen Bericht erhalten, wenn etwas anderes schief geht!
Anthony
Auch wollten Sie wahrscheinlich 2>/dev/null. Mit using wird 2> nulldie Ausgabe nur in eine Datei mit dem Namen "null" im aktuellen Verzeichnis gestellt.
Thelogix