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?


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.


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.


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

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"

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.