ver usuarios usuario resetear crear contraseñas contraseña cambiar mysql bash shell

usuarios - usuario root mysql



Suprimir los mensajes de advertencia usando mysql desde el terminal, pero la contraseña escrita en el script bash (19)

Aquí hay una solución para Docker en un script / bin / sh:

docker exec [MYSQL_CONTAINER_NAME] sh -c ''exec echo "[client]"> /root/mysql-credentials.cnf''

docker exec [MYSQL_CONTAINER_NAME] sh -c ''exec echo "usuario = raíz" >> /root/mysql-credentials.cnf''

docker exec [MYSQL_CONTAINER_NAME] sh -c ''exec echo "password = $ MYSQL_ROOT_PASSWORD" >> /root/mysql-credentials.cnf''

docker exec [MYSQL_CONTAINER_NAME] sh -c ''exec mysqldump --defaults-extra-file = / root / mysql-credentials.cnf --all-database''

Reemplace [MYSQL_CONTAINER_NAME] y asegúrese de que la variable de entorno MYSQL_ROOT_PASSWORD esté establecida en su contenedor.

Espero que te ayude como me pueda ayudar!

Cuando intenté ejecutar el siguiente comando en MySQL desde dentro de Terminal:

mysql -u $user -p$password -e "statement"

La ejecución funciona como se esperaba, pero siempre emite una advertencia:

Advertencia: el uso de una contraseña en la interfaz de línea de comandos puede ser inseguro.

Sin embargo, tengo que llevar a cabo la declaración anterior utilizando una variable de entorno ( $password ) que almacena mi contraseña, porque quiero ejecutar el comando de forma iterativa en el script bash desde el terminal, y definitivamente no me gusta la idea de esperar un aviso Apareciendo y forzándome a ingresar mi contraseña 50 o 100 veces en un solo script. Así que aquí está mi pregunta:

  • ¿Es factible suprimir la advertencia? El comando funciona correctamente como dije, pero la ventana se vuelve bastante desordenada cuando hago un bucle y ejecuto el comando 50 o 100 veces.

  • ¿Debo obedecer el mensaje de advertencia y NO escribir mi contraseña en mi script? Si ese es el caso, ¿tengo que escribir mi contraseña cada vez que el aviso me obliga a hacerlo?

Running man mysql no ayuda, diciendo solo

--show-warnings
Causa advertencias que se muestran después de cada declaración si hay alguna. Esta opción se aplica al modo interactivo y por lotes.

y no menciona nada sobre cómo desactivar la funcionalidad, si no me falta algo.

Estoy en OS X 10.9.1 Mavericks y uso MySQL 5.6 de homebrew.


Así es como obtuve mi script de bash para que mis copias de seguridad diarias de la base de datos mysqldump funcionen de manera más segura. Esta es una expansión de la gran respuesta de Cristian Porta.

  1. Primero use mysql_config_editor (viene con mysql 5.6+) para configurar el archivo de contraseña cifrada. Supongamos que su nombre de usuario es "db_user". Ejecutando desde el indicador de shell:

    mysql_config_editor set --login-path=local --host=localhost --user=db_user --password

    Se le pide la contraseña. Una vez que lo ingresa, el usuario / paso se guarda encriptado en su home/system_username/.mylogin.cnf

    Por supuesto, cambie "system_username" a su nombre de usuario en el servidor.

  2. Cambie su script de bash de esto:

    mysqldump -u db_user -pInsecurePassword my_database | gzip > db_backup.tar.gz

    a esto:

    mysqldump --login-path=local my_database | gzip > db_backup.tar.gz

No más contraseñas expuestas.


Desde https://gist.github.com/nestoru/4f684f206c399894952d

# Let us consider the following typical mysql backup script: mysqldump --routines --no-data -h $mysqlHost -P $mysqlPort -u $mysqlUser -p$mysqlPassword $database # It succeeds but stderr will get: # Warning: Using a password on the command line interface can be insecure. # You can fix this with the below hack: credentialsFile=/mysql-credentials.cnf echo "[client]" > $credentialsFile echo "user=$mysqlUser" >> $credentialsFile echo "password=$mysqlPassword" >> $credentialsFile echo "host=$mysqlHost" >> $credentialsFile mysqldump --defaults-extra-file=$credentialsFile --routines --no-data $database # This should not be IMO an error. It is just a ''considered best practice'' # Read more from http://thinkinginsoftware.blogspot.com/2015/10/solution-for-mysql-warning-using.html


El problema que tuve fue usar la salida en un condicional en un script bash.

Esto no es elegante, pero en una ventana acoplable esto realmente no debería importar. Básicamente, todo lo que hace es ignorar la salida que no está en la última línea. Puedes hacer lo mismo con awk, y cambiar para devolver todo menos la primera línea, etc.

Esto solo devuelve la última línea.

mysql -u db_user -pInsecurePassword my_database ... | sed -e ''$!d''

No suprimirá el error, pero se asegurará de que pueda usar el resultado de una consulta en un script de bash.


Funcionó para mí: solo agregué 2> null después de $(mysql_command) , y suprimirá solo los mensajes de error y advertencia.


La forma más fácil es

mysql -u root -pMYPASSWORD -e "show databases" 2>/dev/null


Otra alternativa es usar sshpass para invocar mysql, por ejemplo:

sshpass -p topsecret mysql -u root -p username -e ''statement''


Otra solución (desde un script, por ejemplo):

sed -i'''' -e "s/password=.*/$/password=$pass/g" ~/.my.cnf mysql -h $host -u $user $db_name -e "$sql_cmd"

La opción -i'''' está aquí para la compatibilidad con Mac OS X. Los sistemas operativos UNIX estándar pueden usar directamente -i


Para PowerShell ( pwsh , no bash ), esta fue una solución bastante rube-goldberg ... Mi primer intento fue envolver las llamadas a mysql en una función try/catch , pero debido a algún comportamiento extraño en el manejo de errores de PowerShell , esto no fue No es viable.

La solución fue anular $ErrorActionPreference solo el tiempo suficiente para combinar y capturar STDERR y STDOUT y analizar la palabra ERROR y volver a lanzar según sea necesario. La razón por la que no pudimos detectar y publicar en "^mysql.*Warning.*password" es porque PowerShell maneja y eleva el error como una secuencia, por lo que debe capturarlo todo para filtrarlo y volver a lanzarlo. : /

Function CallMySQL() { # Cache the error action preference $_temp = $ErrorActionPreference $ErrorActionPreference = "Continue" # Capture all output from mysql $output = (&mysql --user=foo --password=bar 2>&1) # Restore the error action preference $ErrorActionPreference = $_temp if ($output -match "ERROR") { throw $output } elseif($output) { " Swallowing $output" } else { " No output" } }

Nota: PowerShell está disponible para Unix, por lo que esta solución es multiplataforma. Se puede adaptar para bash con algunas modificaciones menores de sintaxis.

Advertencia: hay docenas de casos de borde en los que esto no funciona, como mensajes de error que no están en inglés o declaraciones que devuelven la palabra ERROR en cualquier parte de la salida, pero fue suficiente para tragar la advertencia de una llamada básica a mysql sin bombardeo todo el guión. Esperemos que otros encuentren esto útil.

Sería bueno si mysql simplemente añadiera una opción para suprimir esta advertencia.


Personalmente, uso un contenedor de secuencias de comandos para detectar ese error. Aquí está el ejemplo del código:

#!/bin/bash #echo $@ | cat >> /home/mysqldump.log 2>/dev/null ERR_FILE=/tmp/tmp_mdump.err # Execute dumper /usr/bin/mysqldump $@ 2>$ERR_FILE # Determine error and remove tmp file ERROR=`cat $ERR_FILE` rm $ERR_FILE # Handle an error if [ "" != "$ERROR" ]; then # Error occured if [ "Warning: Using a password on the command line interface can be insecure." != "$ERROR" ]; then echo $ERROR >&2 exit 1 fi fi


Puede ejecutar mySQL y suprimir los mensajes de advertencia y error usando / dev / null, por ejemplo:

# if you run just a SQL-command mysql -u ${USERNAME} -p${PASSWORD} -h ${HOST} ${DATABASE} -e "${STATEMENT}" &> /dev/null # Or you can run SQL-script as a file mysql -u ${USERNAME} -p${PASSWORD} -h ${HOST} ${DATABASE} < ${FILEPATH} &> /dev/null

Dónde:

${USERNAME} - existing mysql user ${PASSWORD} - password ${HOST} - ip or hostname, for example ''localhost'' ${DATABASE} - name of database ${STATEMENT}- SQL command ${FILEPATH} - Path to the SQL-script

¡disfrutar!


Si desea usar una contraseña en la línea de comandos, he encontrado que esto funciona para filtrar el mensaje de error específico:

mysqlcommand 2>&1 | grep -v "Warning: Using a password"

Básicamente, se trata de redireccionar el error estándar a la salida estándar, y usar grep para eliminar todas las líneas que coincidan con "Advertencia: Usar una contraseña".

De esta manera, puedes ver cualquier otra salida, incluyendo errores. Yo uso esto para varios scripts de shell, etc.


Si la versión de su cliente / servidor MySQL es 5.6.xa, una forma de evitar el mensaje de ADVERTENCIA es mediante las herramientas dev.mysql.com/doc/refman/5.6/en/mysql-config-editor.html :

mysql_config_editor set --login-path=local --host=localhost --user=username --password

Luego puedes usarlo en tu shell script:

mysql --login-path=local -e "statement"

En lugar de:

mysql -u username -p pass -e "statement"


También puede ejecutar mysql_config_editor en su script para pasar la contraseña al especificar la ruta de inicio de sesión

expect -c " spawn mysql_config_editor set --login-path=$mySqlUser --host=localhost --user=$mySqlUser --password expect -nocase /"Enter password:/" {send /"$mySqlPassword/r/"; interact} "

Esto inicia una sesión de espera que se puede usar en scripts para interactuar con las solicitudes

Ver este post


También puede simplemente redirigir el error estándar STDERR a / dev / null

Así que hazlo:

mysql -u $user -p$password -e "statement" 2> /dev/null


Un método que es conveniente (pero igualmente inseguro) es utilizar:

MYSQL_PWD=xxxxxxxx mysql -u root -e "statement"

Tenga en cuenta que los documentos oficiales lo recomiendan.
Consulte 6.1.2.1 Pautas para el usuario final para la seguridad de la contraseña (Manual Mysql para la versión 5.6) :

Almacenar su contraseña en la variable de entorno MYSQL_PWD

Este método de especificar su contraseña de MySQL debe considerarse extremadamente inseguro y no debe utilizarse. Algunas versiones de ps incluyen una opción para mostrar el entorno de los procesos en ejecución. En algunos sistemas, si establece MYSQL_PWD , su contraseña estará expuesta a cualquier otro usuario que ejecute ps . Incluso en sistemas sin una versión de ps , no es prudente suponer que no hay otros métodos por los cuales los usuarios puedan examinar los entornos de proceso.


Un sencillo script de trabajo. Nombre este "mysql", y póngalo en su ruta antes de "/ usr / bin". Variantes obvias para otros comandos, o si el texto de advertencia es diferente.

#!/bin/sh ( ( ( ( ( /usr/bin/mysql "$@" ) 1>&9 ) 2>&1 ) | fgrep -v ''mysql: [Warning] Using a password on the command line interface can be insecure.'' ) 1>&2 ) 9>&1


Yo uso algo como:

mysql --defaults-extra-file=/path/to/config.cnf

o

mysqldump --defaults-extra-file=/path/to/config.cnf

Donde config.cnf contiene:

[client] user = whatever password = whatever host = whatever

Esto le permite tener múltiples archivos de configuración, para diferentes servidores / roles / bases de datos. El uso de ~ / .my.cnf solo le permitirá tener un conjunto de configuración (aunque puede ser un conjunto útil de valores predeterminados).

Si se encuentra en una distribución basada en Debian y se ejecuta como root, puede omitir lo anterior y simplemente usar /etc/mysql/debian.cnf para entrar en ...

mysql --defaults-extra-file=/etc/mysql/debian.cnf


shell> mysql_config_editor set --login-path=local --host=localhost --user=localuser --password Enter password: enter password "localpass" here shell> mysql_config_editor set --login-path=remote --host=remote.example.com --user=remoteuser --password Enter password: enter password "remotepass" here

Para ver lo que escribió mysql_config_editor en el archivo .mylogin.cnf, use el comando imprimir:

shell> mysql_config_editor print --all [local] user = localuser password = ***** host = localhost [remote] user = remoteuser password = ***** host = remote.example.com

El comando imprimir muestra cada ruta de inicio de sesión como un conjunto de líneas que comienzan con un encabezado de grupo que indica el nombre de la ruta de inicio de sesión entre corchetes, seguido de los valores de opción para la ruta de inicio de sesión. Los valores de la contraseña están enmascarados y no aparecen como texto claro.

Como se muestra en los ejemplos anteriores, el archivo .mylogin.cnf puede contener varias rutas de inicio de sesión. De esta manera, mysql_config_editor facilita la configuración de múltiples "personalidades" para conectarse a diferentes servidores MySQL. Cualquiera de estos puede seleccionarse por su nombre más adelante usando la opción --login-path cuando invoque un programa cliente. Por ejemplo, para conectarse al servidor local, use este comando:

shell> mysql --login-path=local

Para conectarse al servidor remoto, use este comando:

shell> mysql --login-path=remote