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 echo
Befehl 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'bar
ausgedrü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.