2017-05-03 1 views
0

J'ai un travail cron exécuté par root toutes les heures qui vérifie s'il y a une violation de tripwire. Il m'envoie toujours un email toutes les heures, si j'ai une violation ou non. S'il y a violation, cela inclut le rapport. S'il n'y a pas de violation, il m'envoie un email vide avec juste la ligne d'objet.Le script Bash envoie un courriel même s'il ne le devrait pas

est ici le script:

#!/bin/bash 

# Save report 
tripwire --check > /tmp/twreport 

# Count violations 
v=`grep -c 'Total violations found: 0' /tmp/twreport` 

# Send report 
if [ "$v" -eq 0 ]; then 
     mail -s "[tripwire] Report for `uname -n`" [email protected] < /tmp/twreport 
fi 
+1

S'il envoie un email vide, cela semble indiquer '/ tmp/twreport' est vide. Cela aurait certainement pour résultat que v soit mis à zéro. Suggérer que vous déboguez ce qui est réellement écrit dans ce fichier. – paxdiablo

+0

Le fichier est écrit dans - il montre soit 0 violations ou x nombre de violations. Le v est soit 0 ou 1. Quand je l'exécute manuellement cela fonctionne bien, seulement dans cron ne fonctionne pas. – MarkH

+0

Il existe une grande différence d'environnement entre les terminaux et les tâches cron, ce qui peut poser problème ici. Voir par exemple http://stackoverflow.com/questions/1972690/cannot-get-php-cron-script-to-run/1972763#1972763 – paxdiablo

Répondre

0

Je suggère de changer le code à

if [ -f /tmp/twreport ] # Check file exists 
then 
v=$(grep -c '^Total violations found: 0$' /tmp/twreport) 
#Not suggested using legacy backticks 
if [ "$v" -eq 0 ]; then 
     mail -s "[tripwire] Report for $(uname -n)" [email protected] < /tmp/twreport 
fi 
fi 

Enfin définir le chemin dans Cron avant de mettre la ligne de script. comme

# Setting PATH 
PATH=/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/path/to/tripwire:/and/so/on 
# Now,set up the cron-job for the script 
0  11   *    *   0  /path/to/script 
0

Essayez entourer de guillemets doubles et utiliser le chemin complet

v="`/bin/grep -c 'Total violations found: 0' /tmp/twreport`" 

et

if [ "$v" == "0" ]; then # or = instead of == based on your shell 

Si ceux-ci ne fonctionnent pas vérifier le terme de recherche. Je vois deux espaces avant 0 sur 'trouvé: 0'

+0

L'utilisation des guillemets '" 'n'est pas un problème ici puisque' grep -c' sort toujours un nombre (pas d'espaces ou d'autres trucs bizarres que les guillemets répareraient). – paxdiablo