mysqladmin nimmt kein Inline-Passwort

10

Ich versuche, einen Cron-Job für die Sicherung von meinem Slave-Computer festzulegen. Also muss ich den Sklaven aufhalten

Ich habe einen Befehl erteilt

mysqladmin --user=root --password=test_pass stop-slave

Aber es wirft Fehler:

mysqladmin: Verbindung zum Server bei 'localhost' fehlgeschlagen Fehler: 'Zugriff für Benutzer' root '@' localhost 'verweigert (mit Passwort: YES)'

Jetzt habe ich es mit dem Befehl versucht

mysqladmin --user=root --password stop-slave

Es fordert zur Eingabe des Passworts auf und ich gab als test_passund alles war in Ordnung.

Warum ist das so passiert? Was ist die Alternative?

NB: Übrigens ist meine MySQL-Version mysql-5.0.95-5, es macht keinen Sinn.

Praveen Prasannan
quelle
Hat Ihr Passwort Sonderzeichen, die die Shell möglicherweise interpretiert? Haben Sie versucht, das Passwort in "Anführungszeichen" oder "Anführungszeichen" zu setzen?
Michael - sqlbot
Welche Sonderzeichen werden von der Shell möglicherweise interpretiert? Gibt es Unterlagen?
Praveen Prasannan
1
Zeichen wie $ &! \ [] <> alle kommen als potenziell problematisch in den Sinn. Das Einschließen des Kennworts in 'einfache Anführungszeichen sollte dieses Problem verhindern. gnu.org/software/bash/manual/bashref.html#Quoting
Michael - sqlbot
2
großartig .. arbeiten. Ich möchte dies als Antwort markieren. Können Sie es bitte als Antwort setzen
Praveen Prasannan
@ Michael-sqlbot ja du solltest posten ist als Antwort
RolandoMySQLDBA

Antworten:

21

Befehlszeilenargumente können von der Befehlsshell des Systems interpretiert werden. Dabei wird das Verhalten des Befehls oder der Wert der Argumente geändert, bevor sie an das aufgerufene Programm übergeben werden.

Wenn ein Argument (z. B. der Wert für --password) ein Zeichen enthält, das die Shell möglicherweise interpretiert, müssen sie entweder in Anführungszeichen (normalerweise in einfachen Anführungszeichen 'in Unix oder in doppelten Anführungszeichen "in Windows eingeschlossen) oder einzeln (normalerweise mit einem Backslash \vor jedem Metazeichen) eingeschlossen werden ) um eine Interpretation durch die Shell zu vermeiden.

Während die spezifischen Zeichen systemspezifisch sind, sollten Sie folgende Zeichen beachten:

$ & ! \ [ ] < > `

Wenn das Passwort für ein wirklich schlechtes Beispiel auf pa$$word... gesetzt wäre

mysql --password=pa$$word     # does not work
mysql --password='pa$$word'   # works
mysql --password=pa\$\$word   # works, but slightly unclear what's going on at first glance

Weiterführende Literatur:


Update: Um 'einfache oder "doppelte Anführungszeichen im Kennwort zu umgehen, können Sie diese entweder mit einem führenden Backslash maskieren oder das gesamte Argument in den entgegengesetzten Anführungszeichenstil einschließen, wenn keine anderen Zeichen vorhanden sind, mit denen der ausgewählte Anführungszeichenstil nicht kompatibel ist mit.

mysql --password="like'this" # password has a single quote in the middle
mysql --password='like"this' # password with a double quote in the middle

Wenn Sie ein einfaches Anführungszeichen und andere Sonderzeichen haben, bleibt der Backslash hängen, da unter Unix das doppelte Anführungszeichen "schwächer" ist als ein einfaches Anführungszeichen und viele Metazeichen immer noch erweitert werden, wenn sie in doppelte Anführungszeichen, aber nicht in einfache Anführungszeichen eingeschlossen sind Zitate.

Dies ist nicht MySQL-spezifisch, gilt jedoch für alle Elemente mit Befehlszeilenargumenten.

Normalerweise können Sie den echoBefehl verwenden, um zu sehen, wie die Shell Ihre Argumente interpretiert.

$ echo foo$bar 
foo                # literal 'foo' plus the (empty) shell variable $bar

$ echo foo\$bar
foo$bar            # backslash prevents expansion of $bar as a variable

$ echo "foo$$bar"  # weaker double quote doesn't prevent expansion so
foo9691bar         # the $$ expands to the unix process id (pid) of the current shell

$ echo 'foo$$bar'
foo$$bar           # "stronger" single quote prevents shell expansion

$ echo "foo'bar"
foo'bar            # double quote allows single quote within the literal

Follow-up: Die Bash-Shell (und vermutlich einige andere) ermöglicht das Entkommen von einfachen Anführungszeichen in Zeichenfolgen in einfachen Anführungszeichen, obwohl die Konvention bizarr ist (wahrscheinlich basierend auf einer längst vergessenen Entscheidung, die jetzt im Nebel der Zeit verloren gegangen ist):

Ersetzen Sie jedes Zeichen 'innerhalb der Zeichenfolge durch, '\''bevor Sie die gesamte Zeichenfolge in einfache Anführungszeichen setzen ... damit die Literalzeichenfolge foo'barausgedrückt wird als 'foo'\''bar'.

Wie ich schon sagte, bizarr. Dies ist erforderlich, da ein Backslash einem einfachen Anführungszeichen außerhalb einer Zeichenfolge in einfachen Anführungszeichen, ein Backslash in einer Zeichenfolge in einfachen Anführungszeichen in bash nichts entgeht und Zeichenfolgen in einfachen Anführungszeichen durch mehrere einfache Anführungszeichen geschlossen und wieder geöffnet werden können, solange keine Leerzeichen vorhanden sind dazwischenliegende Zeichen, die eine besondere Bedeutung haben. So '\''die Angabe der Zeichenfolge schließt, dann liefert die wörtliche entkam, wieder öffnet dann die Angabe des Strings.

Michael - sqlbot
quelle
1
Benötigen Sie etwas mehr Klarstellung. Was passiert, wenn einfache Anführungszeichen (') in das Kennwortfeld kommen? Es ist der einzige Weg, mit slash () davonzukommen?
Praveen Prasannan
Was für ein Zufall, dass das Passwort meines Live-Servers aufpa$$word
Umair
0

Zusatz:

Auf einem Windows-Computer hatten wir ebenfalls Probleme mit einem Kennwort: Es enthielt, %das als %%maskiert werden muss (Anführungszeichen allein reichen hier nicht aus).

dognose
quelle