2017-05-03 1 views
0

Ich habe einen Cron-Job von root jede Stunde, die überprüft, ob es eine Stolperdrahtverletzung ist. Es sendet mir immer noch stündlich eine E-Mail, ob ich einen Verstoß habe oder nicht. Wenn ein Verstoß vorliegt, enthält er den Bericht. Wenn es keine Verletzung gibt, sendet es mir eine leere E-Mail mit nur der Betreffzeile.Bash-Skript sendet E-Mail auch wenn es nicht sollte

Hier ist das Skript:

#!/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

Wenn es eine leere E-Mail sendet, scheint dies anzuzeigen, dass '/ tmp/twreport' leer ist. Das würde sicherlich dazu führen, dass "v" auf Null gesetzt wird. Schlage vor, dass Sie debuggen, was tatsächlich in diese Datei geschrieben wird. – paxdiablo

+0

Die Datei wird geschrieben - sie zeigt entweder 0 Verletzungen oder x Anzahl der Verstöße an. Das v ist entweder 0 oder 1. Wenn ich es manuell ausführe funktioniert es gut, nur in Cron funktioniert es nicht. – MarkH

+0

Es gibt einen großen Unterschied in der Umgebung zwischen Terminals und Cron-Jobs, so dass hier das Problem auftreten kann. Siehe zum Beispiel http://stackoverflow.com/questions/1972690/cannot-get-php-cron-script-to-run/1972763#1972763 – paxdiablo

Antwort

0

Ich schlage vor, den Code ändern zu

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 

schließlich den Weg in cron festlegen, bevor Sie das Skript Zeile. wie

# 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

Versuchen mit doppelten Anführungszeichen umgeben und verwenden vollständigen Pfad

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

und

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

Wenn dies nicht funktionieren, die den Suchbegriff überprüfen. Ich sehe zwei Leerzeichen vor 0 auf 'found: 0'

+0

Die Verwendung von "" Anführungszeichen ist hier kein Problem, da 'grep -c' immer eine Zahl ausgibt (keine Leerzeichen oder andere seltsame Dinge, die Anführungszeichen beheben würde). – paxdiablo

Verwandte Themen