Suprime los mensajes de advertencia de MySQL en el script de shell pero permite errores

10

Mis archivos de registro se vuelcan con el siguiente mensaje mientras ejecuto scripts de shell utilizando algunos comandos subyacentes de MySQL.

Aquí está el mensaje:

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

Para detener estos mensajes, estoy usando la siguiente definición de trabajo.

Ejemplo:

run_wrapper.sh |grep -v "Warning: Using a password" > output.log 2>&1

Esto funcionó pero los errores de MySQL no se están registrando output.log.

Si cambio la definición de la siguiente manera, los errores de MySQL comenzarán a aparecer si los hay

run_wrapper.sh > output.log 2>&1

Entonces, la pregunta es ¿cómo suprimir los mensajes de advertencia y también informar los errores de SQL en los archivos de registro utilizando solo la definición cron?

jagadish puvvada
fuente
probablemente deberías usarrun_wrapper.sh >> output.log 2>&1
Rahul
1
No te estoy siguiendo. ¿Dónde desea que vayan los errores / advertencias y dónde quiere que vaya la salida, y qué desea tirar? ¿Qué genera la advertencia de contraseña y por qué tiene errores en MySQL que no desea corregir?
Kusalananda
1
mysql imprime esa advertencia cuando usa la -popción en la línea de comando. En lugar de arreglarlo (p. Ej., Creando una ~/.my.cnfcon 600 permisos), el OP solo quiere ignorar y descartar la advertencia (y solo esa advertencia, no toda stderr)
cas

Respuestas:

25

En su script bash, edítelo en la parte superior

export MYSQL_PWD=yourdbpassword

y consulta mysql como: mysql -u username -h host db -e "statement"

Referencia: De la respuesta publicada en Stackoverflow . También se pueden seguir otras respuestas.

margarita
fuente
2

busca una línea en tu contenedor similar a

mysql -u<username> -p<some_password> -hlocalhost -D<database_name> 

y cambiar a

export MYSQL_PWD=<some_password> ; mysql -u<username> -hlocalhost -D<database_name> 

Esto resuelve la fuente de la advertencia.

Mockler
fuente
Esto tiene sentido :-) ¡Gracias!
Mike Q
1

Parece que te estás perdiendo la redirección stderr de run_wrapper.shsí mismo, por lo que los errores no pasan a través del greparchivo de registro.

Pruebe esto en su lugar si está contento de tener tanto stdout como sdterr escritos en su archivo de registro

run_wrapper.sh 2>&1 | grep -v "Warning: Using a password" > output.log

O si solo desea que se escriban los errores en el archivo de registro, y stdout dejó escrito en el terminal de llamada, intente esto

( run_wrapper.sh 2>&1 1>&3 | grep -v "Warning: Using a password" > output.log ) 3>&1
roaima
fuente
0

Prueba esto:

lf='output.log'
> "$lf"   # first truncate/create the logfile.
run_wrapper.sh >> "$lf" 2> >(grep -v "Warn.*passw.*insec" >> "$lf")

Redirige stderr mediante Process Substitution a grep -v ..., y la salida de eso se agrega >>aoutput.log

Probablemente desee utilizar grepla --line-bufferedopción (GNU) -vy asegurarse de que la salida de error no se retrase.


Si el procesamiento posterior del archivo de registro es una opción aceptable para usted, puede eliminar las líneas "Advertencia:" no deseadas del archivo de registro una vez que run_wrapper.shhaya finalizado.

El siguiente fragmento de script de shell guarda la marca de tiempo (in $ts) del archivo de registro (in $lf) antes de ejecutarlo sed -iy lo restaura después:

lf='output.log'

run_wrapper.sh >& "$lf"

ts=$(date -r "$lf" '+%Y%m%d%H%M.%S')
sed -i -e '/Warning: Using a password/d' "$lf"
touch -t "$ts" "$lf"

Si necesita preservar el inodo del archivo de registro (por ejemplo, porque tiene enlaces duros), use en edlugar de sed:

ts=$(date -r "$lf" '+%Y%m%d%H%M.%S')
printf "%s\n" 'g/Warning: Using a password/d' w | ed -s "$lf"
touch -t "$ts" "$lf"
cas
fuente
Gracias por la respuesta. He probado la opción sugerida como a continuación
jagadish puvvada
La opción sed crea líneas en blanco y también tenemos que eliminarlas y también cambia la marca de tiempo del archivo
jagadish puvvada
La opción post-proceso-con-sed también cambia el inodo y la marca de tiempo, eso es normal -i(y la mayoría de las formas de edición "en el lugar"). Si se ejecuta inmediatamente después, solo debería ser microsegundos o segundos diferentes, dependiendo del tamaño del archivo de registro, por supuesto, pero no hay manera a. dde comandos (línea de borrado) en sedserá crear una línea en blanco - lo que es exactamente lo que quiere decir con eso?
cas
La sedopción @jagadishpuvvada ahora guarda y restaura la marca de tiempo de output.log.
cas
0

Intente agregar esto al final de su comando:

/ dev / null 2> y 1

usuario236164
fuente