mysqladmin no toma contraseña en línea

10

Estoy tratando de configurar un trabajo cron para tomar una copia de seguridad de mi máquina esclava. Entonces necesito detener al esclavo

Emití un comando

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

Pero es un error de lanzamiento:

mysqladmin: error al conectar al servidor en 'localhost': 'Acceso denegado para el usuario' root '@' localhost '(usando la contraseña: SÍ)'

Ahora lo intenté con el comando

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

Pide contraseña y di como test_passy todo estaba bien.

¿Por qué sucedió eso? Cual es la alternativa?

NB: Por cierto, mi versión mysql es mysql-5.0.95-5, tiene sentido.

Praveen Prasannan
fuente
¿Su contraseña tiene caracteres especiales que el shell podría estar interpretando? ¿Has intentado encerrar la contraseña en "comillas" o "comillas"?
Michael - sqlbot
¿Cuáles son los caracteres especiales que Shell podría interpretar? ¿hay alguna documentación?
Praveen Prasannan
1
Personajes como $ &! \ [] <> todos vienen a la mente como potencialmente problemáticos. El encerrar la contraseña entre 'comillas simples debería evitar ese problema. gnu.org/software/bash/manual/bashref.html#Quoting
Michael - sqlbot
2
genial ... trabajando. Me gustaría marcar esto como respuesta. ¿Puedes decirlo como respuesta?
Praveen Prasannan
@ Michael-sqlbot, sí, debe publicar es la respuesta
RolandoMySQLDBA

Respuestas:

21

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 echocomando 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'barse 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.

Michael - sqlbot
fuente
1
Necesito un poco más de aclaración. ¿Qué pasa si las comillas simples (') vienen en el campo de contraseña? ¿Escapar con slash () es la única forma?
Praveen Prasannan
Qué coincidencia en la que está configurada la contraseña de mi servidor en vivopa$$word
Umair
0

Adición:

En una máquina con Windows, también tuvimos problemas con una contraseña: contenía la %que se debe escapar como %%(las citas por sí solas no son suficientes aquí)

dognose
fuente