Les arguments de la ligne de commande sont sujets à interprétation par l'interpréteur de commandes du système, modifiant le comportement de la commande ou modifiant la valeur des arguments avant qu'ils ne soient transmis au programme appelé.
Lorsqu'un argument (tel que la valeur de --password
) contient un caractère que le shell peut interpréter, il doit être soit cité (généralement entre guillemets simples '
dans unix ou double entre guillemets "
dans Windows) ou échappé individuellement (généralement avec une barre oblique inverse \
avant chaque métacaractère). ) pour éviter une interprétation par le shell.
Bien que les caractères spécifiques soient spécifiques au système, certains caractères à surveiller incluent:
$ & ! \ [ ] < > `
Si le mot de passe, pour un très mauvais exemple, était défini sur 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
Lectures complémentaires:
Mise à jour: pour échapper aux guillemets '
simples ou "
doubles dans le mot de passe, vous pouvez soit les échapper avec une barre oblique inversée, soit enfermer l'argument entier dans le style de guillemets opposé s'il n'y a pas d'autres caractères que le style de citation choisi n'est pas compatible avec.
mysql --password="like'this" # password has a single quote in the middle
mysql --password='like"this' # password with a double quote in the middle
Si vous avez un guillemet simple et d'autres caractères spéciaux, vous êtes coincé avec une barre oblique inversée car, sous Unix, le guillemet double est "plus faible" qu'un guillemet simple et de nombreux métacaractères sont toujours développés lorsqu'ils sont placés entre guillemets doubles mais pas simples citations.
Ce n'est pas spécifique à MySQL mais s'applique à tout ce qui a des arguments en ligne de commande.
Vous pouvez généralement utiliser la echo
commande pour voir comment le shell interprète vos arguments.
$ 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
Suivi: le shell bash (et vraisemblablement certains autres) permet d'échapper aux guillemets simples dans les chaînes entre guillemets simples, bien que la convention soit bizarre (probablement basée sur une décision oubliée depuis longtemps perdue dans la nuit des temps):
Remplacez chacun '
à l'intérieur de la chaîne par '\''
avant de mettre la chaîne entière entre guillemets simples ... afin que la chaîne littérale foo'bar
soit exprimée sous la forme 'foo'\''bar'
.
Comme je l'ai dit, bizarre. Cela est nécessaire car une barre oblique inversée échappe à un guillemet simple en dehors d'une seule chaîne entre guillemets, une barre oblique inversée n'échappe rien à l' intérieur d'une chaîne entre guillemets simples dans bash, et les chaînes entre guillemets simples peuvent être fermées et rouvertes par plusieurs guillemets simples tant qu'il n'y a pas d'échappée personnages intermédiaires qui ont une signification particulière. Alors '\''
ferme la citation de la chaîne, puis fournit alors littéral, se sont échappés rouvre la citation de la chaîne.