Supprimer les messages d'avertissement de MySQL dans le script shell mais autoriser les erreurs


10

Mes fichiers journaux sont vidés avec le message suivant lors de l'exécution de scripts shell à l'aide de certaines commandes MySQL sous-jacentes.

Voici le message:

"Avertissement: l'utilisation d'un mot de passe sur l'interface de ligne de commande peut être peu sûre."

Pour arrêter ces messages, j'utilise la définition de travail suivante.

Exemple:

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

Cela a fonctionné mais les erreurs MySQL ne sont pas enregistrées output.log.

Si je modifie la définition comme suit, les erreurs MySQL commencent à apparaître le cas échéant

run_wrapper.sh > output.log 2>&1

La question est donc de savoir comment supprimer les messages d'avertissement et également signaler les erreurs SQL dans les fichiers journaux en utilisant uniquement la définition cron?


vous devriez probablement utiliserrun_wrapper.sh >> output.log 2>&1
— Rahul

1
Je ne suis pas en train de suivre. Où voudriez-vous que les erreurs / avertissements aillent et où voudriez-vous que la sortie aille, et que voudriez-vous jeter? Qu'est-ce qui génère l'avertissement de mot de passe et pourquoi avez-vous des erreurs dans MySQL que vous ne voulez pas corriger?
— Kusalananda

1
mysql affiche cet avertissement lorsque vous utilisez l' -poption sur la ligne de commande. Au lieu de le corriger (par exemple en créant un ~/.my.cnfavec 600 perms), l'OP veut simplement ignorer et rejeter l'avertissement (et seulement cet avertissement, pas tout stderr)
— cas

Réponses:


25

Dans votre script bash, modifiez-le en haut

export MYSQL_PWD=yourdbpassword

et la requête mysql comme: mysql -u username -h host db -e "statement"

Référence: D'après la réponse publiée sur Stackoverflow . D'autres réponses peuvent également être suivies.


2

recherchez une ligne dans votre wrapper similaire à

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

et changer pour

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

cela résout la source de l'avertissement.


Cela a du sens :-) Thx!
— Mike Q

1

Il semble que la redirection stderr manque de run_wrapper.shlui-même, de sorte que les erreurs ne passent pas par le grepet de là jusqu'au fichier journal.

Essayez ceci à la place si vous êtes content d'avoir à la fois stdout et sdterr écrits dans votre fichier journal

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

Ou si vous ne voulez que les erreurs écrites dans le fichier journal, et stdout laissé l'écriture sur le terminal appelant, essayez ceci

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

0

Essaye ça:

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

Redirige stderr via Substitution de processus vers grep -v ..., et la sortie de celle-ci est ajoutée >>àoutput.log

Vous voudrez probablement utiliser l' option de (GNU) grepet vous assurer que la sortie d'erreur n'est pas retardée.--line-buffered-v


Si le post-traitement du fichier journal est une option acceptable pour vous, vous pouvez simplement supprimer la ou les lignes "Avertissement:" indésirables du fichier journal après la run_wrapper.shfin.

Le fragment de script shell suivant enregistre l'horodatage (in $ts) du fichier journal (in $lf) avant de l'exécuter sed -iet le restaure ensuite:

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 vous devez conserver l'inode du fichier journal (par exemple parce qu'il a des liens durs), utilisez edplutôt que 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"

Merci pour la réponse. J'ai essayé l'option suggérée comme ci
— jagadish puvvada

L'option sed crée des lignes vides et nous devons également les supprimer et cela modifie également l'horodatage du fichier
— jagadish puvvada

L'option post-process-with-sed modifie également l'inode ainsi que l'horodatage - ce qui est normal pour -i(et la plupart des formes d'édition "sur place"). Si elle est exécutée immédiatement après, elle ne devrait différer que de quelques microsecondes ou secondes, selon la taille du fichier journal bien sûr , mais il n'y a aucun moyen une. dcommande (ligne de suppression) en sedva créer une ligne vide - exactement ce que voulez - vous dire par là?
— čAS

L' sedoption @jagadishpuvvada enregistre et restaure désormais l'horodatage de output.log.
— cas

0

Essayez d'ajouter ceci à la fin de votre commande:

/ dev / null 2> & 1

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.