Gli argomenti della riga di comando sono soggetti a interpretazione da parte della shell dei comandi del sistema, modificando il comportamento del comando o cambiando il valore degli argomenti prima che vengano passati al programma chiamato.
Quando un argomento (come il valore per --password
) contiene un carattere che la shell può interpretare, devono essere tra virgolette (di solito racchiuse tra virgolette singole '
in unix o virgolette doppie "
in Windows) o salvate singolarmente (di solito con una barra rovesciata \
prima di ogni metacarattere ) per evitare l'interpretazione da parte della shell.
Mentre i caratteri specifici sono specifici del sistema, alcuni personaggi a cui prestare attenzione includono:
$ & ! \ [ ] < > `
Se la password, per un esempio davvero negativo, fosse impostata su pa$$word
...
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
Ulteriori letture:
Aggiornamento: per sfuggire alle virgolette '
singole o "
doppie nella password, è possibile sfuggirle con una barra rovesciata iniziale o racchiudere l'intero argomento nello stile opposto delle virgolette se non ci sono altri caratteri che lo stile di quotazione scelto non è compatibile con.
mysql --password="like'this" # password has a single quote in the middle
mysql --password='like"this' # password with a double quote in the middle
Se hai una virgoletta singola e anche altri caratteri speciali, sei bloccato con la barra rovesciata perché, in unix, la doppia virgoletta è "più debole" di una virgoletta singola e molti metacaratteri vengono ancora espansi se racchiusi tra virgolette doppie ma non singole citazioni.
Questo non è specifico di MySQL ma si applica a qualsiasi cosa con argomenti da riga di comando.
In genere puoi usare il echo
comando per vedere come la shell sta interpretando i tuoi argomenti.
$ 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: la shell bash (e presumibilmente alcune altre) consente di sfuggire a virgolette singole all'interno di stringhe a virgoletta singola, sebbene la convenzione sia bizzarra (probabilmente basata su una decisione dimenticata da tempo perduta ora nella notte dei tempi):
Sostituisci ciascuna '
all'interno della stringa con '\''
prima di racchiudere l'intera stringa tra virgolette singole ... in modo che la stringa letterale foo'bar
sia espressa come 'foo'\''bar'
.
Come ho detto, bizzarro. Ciò è necessario perché una barra rovesciata sfugge a una singola virgoletta all'esterno di una singola stringa tra virgolette, una barra rovesciata non sfugge a nulla all'interno di una stringa tra virgolette singole in bash e le stringhe tra virgolette singole possono essere chiuse e riaperte da più virgolette singole purché non vi siano caratteri di escape. personaggi che hanno un significato speciale. Quindi '\''
chiude le virgolette della stringa, quindi fornisce il letterale con escape, quindi riapre le virgolette della stringa.