Los argumentos de la línea de comandos están sujetos a interpretación por el shell de comandos del sistema, cambiando el comportamiento del comando o cambiando el valor de los argumentos antes de pasarlos al programa llamado.
Cuando un argumento (como el valor de --password
) contiene un carácter que el intérprete de comandos puede interpretar, debe citarse (generalmente entre comillas simples '
en unix o comillas dobles "
en Windows) o escapar individualmente (generalmente con una barra diagonal inversa \
antes de cada metacarácter) ) para evitar la interpretación por parte del shell.
Si bien los caracteres específicos son específicos del sistema, algunos caracteres a tener en cuenta incluyen:
$ & ! \ [ ] < > `
Si la contraseña, por un mal ejemplo, se estableció en 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
Otras lecturas:
Actualización: para escapar de las comillas '
simples o "
dobles en la contraseña, puede escapar de ellas con una barra diagonal inversa inicial, o encerrar todo el argumento en el estilo opuesto de las comillas si no hay otros caracteres que el estilo de comillas elegido no sea compatible 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
Si tiene una comilla simple y otros caracteres especiales también, está atascado con la barra invertida que se escapa porque, en Unix, la comilla doble es "más débil" que una comilla simple y muchos metacaracteres aún se expanden cuando se incluyen entre comillas dobles pero no una sola. citas.
Esto no es específico de MySQL, pero se aplica a cualquier cosa con argumentos de línea de comandos.
Por lo general, puede usar el echo
comando para ver cómo el shell está interpretando sus argumentos.
$ 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
Seguimiento: el shell bash (y presumiblemente algunos otros) permite escapar de comillas simples dentro de cadenas de comillas simples, aunque la convención es extraña (probablemente basada en una decisión olvidada hace mucho tiempo perdida ahora por las brumas del tiempo):
Reemplace cada uno '
dentro de la cadena con '\''
antes de envolver la cadena completa entre comillas simples ... para que la cadena literal foo'bar
se exprese como 'foo'\''bar'
.
Como dije, extraño. Esto es necesario porque una barra invertida escapa de una comilla simple fuera de una sola cadena entre comillas, una barra invertida no escapa de nada dentro de una cadena entre comillas simples en bash, y las cadenas entre comillas simples se pueden cerrar y volver a abrir mediante comillas simples siempre que no haya escapes personajes intermedios que tienen un significado especial. Entonces '\''
cierra la cita de la cadena, luego proporciona el literal escapado, luego vuelve a abrir la cita de la cadena.