Suprimir mensajes de advertencia usando mysql desde el Terminal, pero la contraseña escrita en el script bash


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: Usar una contraseña en la interfaz de línea de comandos puede ser inseguro.

Sin embargo, tengo que realizar la instrucción anterior usando una variable de entorno ($password) que almacena mi contraseña, porque quiero ejecutar el comando iterativamente en el script bash desde dentro de Terminal, y definitivamente no me gusta la idea de esperar a que aparezca un mensaje y obligarme 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 he dicho, pero la ventana se vuelve bastante desordenada cuando hago un bucle y corro 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, entonces tengo que escribir mi contraseña ¿cada vez que el aviso me obliga a hacerlo?

Correr man mysql no ayuda, diciendo solo

--show-warnings
Haga que las advertencias se muestren después de cada instrucción si hay alguna. Esta opción se aplica al modo interactivo y al modo 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.

Author: Simon East, 2013-12-24

19 answers

Si la versión cliente/servidor de MySQL es 5.6.x una forma de evitar el mensaje de ADVERTENCIA están utilizando el mysql_config_editor herramientas:

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

Entonces puedes usar en tu script de shell:

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

En lugar de:

mysql -u username -p pass -e "statement"
 188
Author: Cristian Porta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-25 23:41:21

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. Usar~/. my. cnf solo le permitirá tener un conjunto de configuración (aunque puede ser un conjunto útil de valores predeterminados).

Si está en una distribución basada en Debian, y se ejecuta como root, podría omitir lo anterior y simplemente usar /etc/mysql/debian.cnf para entrar ... :

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

 154
Author: David Goodwin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-09-23 19:35:01

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

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

Tenga en cuenta que los documentos oficiales recomiendan no hacerlo.
Ver 6.1.2.1 Directrices para el Usuario Final para la Seguridad de Contraseñas (Manual de Mysql para la Versión 5.6):

Almacenar su contraseña en la variable de entorno MYSQL_PWD

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

 143
Author: Ivan Dokov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-21 14:29:08

Si desea utilizar 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 está redirigiendo el error estándar a la salida estándar and y usando grep para soltar todas las líneas que coincidan con "Advertencia: Usando una contraseña".

De esta manera, puede ver cualquier otra salida, incluidos los errores. Uso esto para varios scripts de shell, etc.

 45
Author: johnmontfx,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-15 19:01:58

Así es como obtuve mi script 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". Corriendo desde el prompt del shell:

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

    Solicita la contraseña. Una vez que lo ingrese, el usuario / pase se guardará encriptado en su home/system_username/.mylogin.cnf

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

  2. Cambie su script 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.

 30
Author: Buttle Butkus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-30 21:41:27

La forma más fácil es

mysql -u root -pMYPASSWORD -e "show databases" 2>/dev/null
 10
Author: JavaGuy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-23 17:25:03

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 indicaciones

Ver este post

 8
Author: phylanx,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:47:28

De 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
 4
Author: Nestor Urquiza,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-08 13:28:59

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

sshpass -p topsecret mysql -u root -p username -e 'statement'
 1
Author: lewiz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-13 14:44:46
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 mysql_config_editor escribió al.mylogin.archivo cnf, utilice el comando print:

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

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

Como se muestra en los ejemplos anteriores, el .mylogin.el archivo 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 se puede seleccionar por nombre más tarde utilizando la opción login login-path cuando invoque un programa cliente. Por ejemplo, para conectarse al servidor local, utilice este comando:

shell> mysql --login-path=local

Para conectarse al servidor remoto, utilice este comando:

shell> mysql --login-path=remote
 1
Author: Beta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-15 14:14:46

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 "user=root" >> /root/mysql-credentials.cnf "

Docker exec [MYSQL_CONTAINER_NAME] sh-c 'exec echo "password=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 all-databases "

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 podría ayudarme a mí !

 1
Author: pcmanprogrammeur,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-12 18:44:27

Personalmente, uso script wrapper para detectar ese error. Aquí está el ejemplo de 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
 0
Author: And,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-29 14:29:16

Para PowerShell (pwsh, no bash), esta era 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 viable.

La solución fue anular el $ErrorActionPreference 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 capturar y liberar en "^mysql.*Warning.*password" es porque PowerShell maneja y eleva el error como una secuencia, por lo que debe capturarlo todo para filtrar y volver a lanzar. :/

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 a bash con algunas modificaciones menores de sintaxis.

Advertencia: Hay docenas de casos extremos en los que esto no funcionará, como mensajes de error no en inglés o declaraciones que devuelven la palabra ERROR en cualquier lugar de la salida, pero fue suficiente para tragar la advertencia para una llamada básica a mysql sin bombardear todo el script. Esperemos que otros encuentren esto útil.

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

 0
Author: tresf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-27 15:22:29

También puede redirigir la salida de error estándar STDERR a / dev / null

Así que solo hazlo:

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

 0
Author: Joseph Shih,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-05 07:34:01

Otra solución (de 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 -i

 -2
Author: Benoit Duffez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-16 12:07:02

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

Esto no es elegante, pero en un docker env esto realmente no debería importar. Básicamente todo lo que hace es ignorar la salida que no está en la última línea. Puede hacer algo similar 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 la salida de una consulta en un script bash.

 -2
Author: WiR3D,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-29 19:46:27

Un simple script workaroud. Ponle el nombre de "mysql", y ponlo en tu 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
 -2
Author: David G.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-14 04:09:26

Puede ejecutar MySQL y suprimir 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

Donde:

${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

Disfrute!

 -3
Author: Stan Khalipa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-12 08:06:25

Funcionó para mí- Acaba de agregar 2> null después de $(mysql_command), y solo suprimirá los Errores y mensajes de advertencia.

 -3
Author: MMG,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-10 12:46:25