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?

puvvada jagadish
la source
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.

Marguerite
la source
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.

Mockler
la source
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
roaima
la source
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"
cas
la source
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

user236164
la source