Cuando intenté ejecutar el siguiente comando en MySQL desde 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 usando una variable de entorno ( $password
) que almacena mi contraseña, porque quiero ejecutar el comando iterativamente en el script bash desde Terminal, y definitivamente no me gusta la idea de esperar que aparezca un mensaje. y obligá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 paso 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 mensaje me obliga a hacerlo?
Correr man mysql
no ayuda, solo decir
--show-warnings
Causar que se muestren advertencias después de cada declaración si hay alguna. Esta opción se aplica al modo interactivo y por lotes.
y no menciona nada acerca de 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.
[client]
password=my_password
en~/.my.cnf
). Seguramente también tiene algunas implicaciones de seguridad, pero al menos no es accesible para cualquiera que pueda ejecutarps
, y usted tiene control sobre esto con permisos de archivo.mysql -u root password root -e "statement" > /dev/null
?pexcept
. Puede hacer inserciones de terminal y también manejar los comentarios que da el comando. De esta forma, puede omitir esa salida detallada y la tira de la salida real que desea :)Respuestas:
Si su versión de cliente / servidor MySQL es una forma 5.6.xa de evitar que el mensaje de ADVERTENCIA esté utilizando las herramientas mysql_config_editor :
Luego puede usar en su script de shell:
En vez de:
fuente
--login-path
tiene que venir antes que todos los demás argumentos. Estaba intentandomysqldump --tables --login-path=local
y obteniendo el errorunknown variable 'login-path=local'
.Yo uso algo como:
o
Donde config.cnf contiene:
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 configuraciones (aunque puede ser un conjunto útil de valores predeterminados).
Si está 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 ...:
mysql --defaults-extra-file=/etc/mysql/debian.cnf
fuente
--defaults-extra-file
debe ser la primera opción, de lo contrario mysql se quejamysqldump: unknown variable 'defaults-extra-file
.MYSQL_PWD
variable ...mysql --defaults-extra-file=<(printf "[client]\nuser = %s\npassword = %s" "$user" "$pwd") -e "statement"
. Dado queprintf
Bash lo ejecuta directamente, no aparece enps
.--defaults-file
lugar de--defaults-extra-file
, porque este último daba preferencia a la configuración en ~ / .my.cnf.Un método que es conveniente (pero igualmente inseguro) es usar:
Tenga en cuenta que los documentos oficiales recomiendan no hacerlo.
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) :
fuente
Access denied for user 'root'@'localhost' (using password: NO)
export MYSQL_PWD=whatever
.export
, simplemente colóquelo todo en una línea:MYSQL_PWD=xxxxxxxx mysql -u root -e "statement"
Si desea utilizar una contraseña en la línea de comando, he descubierto que esto funciona para filtrar el mensaje de error específico:
Básicamente es redirigir el error estándar a la salida estándar, y usar grep para eliminar todas las líneas que coinciden con "Advertencia: Usar una contraseña".
De esta manera, puede ver cualquier otra salida, incluidos los errores. Lo uso para varios scripts de shell, etc.
fuente
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.
Primero use mysql_config_editor (viene con mysql 5.6+) para configurar el archivo de contraseña cifrado. Supongamos que su nombre de usuario es "db_user". Ejecutando desde el indicador de comandos de la shell:
Solicita la contraseña. Una vez que lo ingrese, el usuario / pase se guardará cifrado en su
home/system_username/.mylogin.cnf
Por supuesto, cambie "system_username" a su nombre de usuario en el servidor.
Cambie su script bash de esto:
a esto:
No más contraseñas expuestas.
fuente
La forma más fácil es
fuente
2>/dev/null | grep -v "mysql: [Warning] Using a password on the command line interface can be insecure."
para suprimir solo la advertencia en cuestiónTambién puede ejecutar mysql_config_editor en su script para pasar la contraseña al especificar la ruta de inicio de sesión
Esto inicia una sesión de espera que se puede usar en scripts para interactuar con las indicaciones
Ver esta publicación
fuente
ok, solución sin archivos temporales ni nada:
es similar a lo que otros han mencionado, pero aquí no necesita un archivo real, esta parte del comando falsifica el archivo:
<(echo ...)
(observe que no hay espacio en el medio de<(
fuente
.my.cnf
archivo~/.
con una entrada de contraseñaPara ver lo que mysql_config_editor escribió en el archivo .mylogin.cnf, use el comando de impresión:
El comando de impresión 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 las contraseñas están enmascarados y no aparecen como texto claro.
Como se muestra en los ejemplos anteriores, el archivo .mylogin.cnf puede contener múltiples 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 nombre más tarde utilizando la opción --login-path cuando invocas un programa cliente. Por ejemplo, para conectarse al servidor local, use este comando:
Para conectarse al servidor remoto, use este comando:
fuente
De https://gist.github.com/nestoru/4f684f206c399894952d
fuente
Otra alternativa es usar sshpass para invocar mysql, por ejemplo:
fuente
Un simple script de workaroud. Nombre este "mysql" y póngalo en su camino antes de "/ usr / bin". Variantes obvias para otros comandos, o si el texto de advertencia es diferente.
fuente
Aquí hay una solución para Docker en un script / bin / sh:
Reemplace [MYSQL_CONTAINER_NAME] y asegúrese de que la variable de entorno MYSQL_ROOT_PASSWORD esté configurada en su contenedor.
Espero que te ayude como me podría ayudar!
fuente
docker exec [MYSQL_CONTAINER_NAME] sh -c 'exec echo "[client] [RETURN HERE] password=pa55" > /root/defaults'
usar el--defaults-file
ya recoge la raíz también.También puede simplemente redirigir la salida STDERR de error estándar a / dev / null
Entonces solo hazlo:
mysql -u $user -p$password -e "statement" 2> /dev/null
fuente
Personalmente, uso el contenedor de script para detectar ese error. Aquí está el ejemplo de código:
fuente
Para PowerShell (
pwsh
nobash
), esta fue una solución bastante rube-goldberg ... Mi primer intento fue ajustar las llamadasmysql
en unatry/catch
función, pero debido a un comportamiento extraño en el manejo de errores de PowerShell , esto no fue viable.La solución fue reemplazar el
$ErrorActionPreference
suficiente sólo el tiempo para combinar y capturaSTDERR
ySTDOUT
y análisis sintáctico de la palabraERROR
y re-tiro, según sea necesario. La razón por la que no pudimos detectar y liberar"^mysql.*Warning.*password"
es porque PowerShell maneja y genera el error como una transmisión, por lo que debe capturarlo todo para filtrar y volver a lanzar. : /Nota: PowerShell está disponible para Unix, por lo que esta solución es multiplataforma. Se puede adaptar
bash
con algunas modificaciones menores de sintaxis.Advertencia: hay docenas de casos extremos en los que esto no funcionará, como mensajes de error en inglés o declaraciones que devuelven la palabra
ERROR
en cualquier parte de la salida, pero fue suficiente para tragar la advertencia para una llamada básicamysql
sin bombardear el guión completo Esperemos que otros encuentren esto útil.Sería bueno si
mysql
simplemente agregara una opción para suprimir esta advertencia.fuente
Si utiliza Rundeck para programar sus tareas, o cualquier otra plataforma donde solicite un
mylogin.cnf
archivo, he utilizado con éxito el siguiente código de shell para proporcionar una nueva ubicación para el archivo antes de continuar con las llamadas sql:¿Dónde
MYSQL_TEST_LOGIN_FILE
está una variable de entorno que se puede establecer en una ruta de archivo diferente a la predeterminada?Esto es especialmente útil si está ejecutando un proceso bifurcado y no puede mover o copiar archivos al
$HOME
directorio.Ver documentación aquí.
fuente
la mejor solución es usar alias:
ejemplo, pon esto en tu script:
luego más tarde en su script para cargar una base de datos:
para ejecutar una declaración:
fuente
Definir el ayudante:
Úselo:
Tachaan! Su código es limpio y agradable de leer.
(probado con bash)
fuente
Otra solución (de un script, por ejemplo):
La
-i''
opción está aquí para compatibilidad con Mac OS X. Los sistemas operativos UNIX estándar pueden usar directamente-i
fuente
El problema que tuve fue usar la salida en condicional en un script bash.
Esto no es elegante, pero en un entorno de docker 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 lo mismo con awk, y cambiar para devolver todo excepto la primera línea, etc.
Esto solo devuelve la última línea
No suprimirá el error, pero se asegurará de que pueda usar el resultado de una consulta en un script bash.
fuente
La forma más fácil:
Ingrese esto y deberá ingresar su contraseña.
Nota: Sí, sin punto y coma.
fuente
Puede ejecutar mySQL y suprimir mensajes de advertencia y error utilizando / dev / null, por ejemplo:
Dónde:
¡disfrutar!
fuente
Funcionó para mí: solo lo agregué
2> null
después de$(mysql_command)
, y eliminará solo los mensajes de Errores y Advertencia.fuente
2>/dev/null
. El uso2> null
solo pondría la salida en un archivo llamado "nulo" en el directorio actual.