"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

cron: script problem

wergor 09.06.2014 - 12:35 1950 7
Posts

wergor

connoisseur de mimi
Avatar
Registered: Jul 2005
Location: vulkanland
Posts: 4095
ich habe hier ein script, das clamscan ausführt und den report als email an root sendet falls infizierte dateien gefunden wurden. die file liegt in /etc/cron.weekly/ und funktioniert auch wie gewünscht wenn ich es von hand (als root) ausführe. cron scheint das script aber nicht auszuführen (bin nicht sicher, zumindest kommen keine email reports rein)
Code:
#!/bin/bash

# email subject
SUBJECT="VIRUS DETECTED ON `hostname`!!!"
# Email To ?
EMAIL="root@localhost"
# Log location
LOG=/var/log/clamav/scan.log


check_scan () {

    # Check the last set of results. If there are any "Infected" counts that aren't zero, we have a problem.
    if [ `tail -n 12 ${LOG}  | grep Infected | grep -v 0 | wc -l` != 0 ]
    then
        EMAILMESSAGE=`mktemp /tmp/virus-alert.XXXXX`
        echo "To: ${EMAIL}" >>  ${EMAILMESSAGE}
        echo "From: [email]alert@domain.com[/email]" >>  ${EMAILMESSAGE}
        echo "Subject: ${SUBJECT}" >>  ${EMAILMESSAGE}
        echo "Importance: High" >> ${EMAILMESSAGE}
        echo "X-Priority: 1" >> ${EMAILMESSAGE}
        echo "`tail -n 50 ${LOG}`" >> ${EMAILMESSAGE}
        sendmail -t < ${EMAILMESSAGE}
    fi

}

clamscan -r / --exclude-dir=/sys/ --quiet --infected --log=${LOG}

check_scan
es gäbe zwar die möglichkeit das script irgendwo hin zu verschieben und mit crontab -e das ausführen zu planen. ich würde aber gerne wissen, ob/wie ich das scipt ausführen lassen kann, wenn es in /etc/cron.weekly liegt.

Crash Override

BOfH
Registered: Jun 2005
Location: Germany
Posts: 2951
Geb einfach mal für alle Binaries die du aufrufst den kompletten Pfad an.

wergor

connoisseur de mimi
Avatar
Registered: Jul 2005
Location: vulkanland
Posts: 4095
Du meinst grep, clamscan etc?

Crash Override

BOfH
Registered: Jun 2005
Location: Germany
Posts: 2951
Genau, cron kennt die Umgebungsvariablen wie den Suchpfad deiner Shell nicht.

wergor

connoisseur de mimi
Avatar
Registered: Jul 2005
Location: vulkanland
Posts: 4095
scheint zu funktionieren, danke :)

COLOSSUS

Administrator
GNUltra
Avatar
Registered: Dec 2000
Location: ~
Posts: 12070
Weil man es so oft sieht... sowas:

Code:
if [ `tail -n 12 ${LOG}  | grep Infected | grep -v 0 | wc -l` != 0 ]
then
[...]

ist gleich mehrfach redundant und unnoetig.

Viel eleganter waere:

Code:
if tail -n 12 "${LOG}" | grep -Fq Infected
then
[...]

An dem Script koennte man sonst natuerlich auch noch so einiges verbessern, aber ich will nicht langweilen ;)

wergor

connoisseur de mimi
Avatar
Registered: Jul 2005
Location: vulkanland
Posts: 4095
Bin für alle vorschläge offen :) (ist ein copy-paste script aus dem internet)

edit:
Zitat von COLOSSUS
Code:
if tail -n 12 "${LOG}" | grep -Fq Infected
then
[...]
funktioniert nicht wie gewünscht, mit dieser zeile werden auch emails gesendet wenn nichts gefunden wurde.

edit2:
Code:
#!/bin/bash

# email subject
SUBJECT="VIRUS DETECTED ON `hostname`!!!"
# Email To ?
EMAIL="root@localhost"
# Log location
LOG=/var/log/clamav/scan.log
#Summary Lines
SUMMARY="11"

check_scan () {

    # Check the last set of results. If there are any "Infected" counts that aren't zero, we have a problem.
    local infectedCount=`tail -n 8 ${LOG} | grep "Infected files" | grep -o "[^ ]*$"`
    local linesToPrint=$(( $SUMMARY + $infectedCount ))
    if [ $infectedCount != 0 ]
    then
        EMAILMESSAGE=`mktemp /tmp/virus-alert.XXXXX`
        echo "To: ${EMAIL}" >>  ${EMAILMESSAGE}
        echo "From: [email]alert@domain.com[/email]" >>  ${EMAILMESSAGE}
        echo "Subject: ${SUBJECT}" >>  ${EMAILMESSAGE}
        echo "Importance: High" >> ${EMAILMESSAGE}
        echo "X-Priority: 1" >> ${EMAILMESSAGE}
        echo "`tail -n $linesToPrint ${LOG}`" >> ${EMAILMESSAGE}
        sendmail -t < ${EMAILMESSAGE}
    fi

}

/usr/bin/clamscan -r / --exclude-dir=/sys/ --quiet --infected --log=${LOG}
check_scan
scheint gut zu funktionieren :) und schickt auch nur die relevanten ergebnisse.
Bearbeitet von wergor am 10.06.2014, 12:59

-=Willi=-

The Emperor protects
Avatar
Registered: Aug 2003
Location: ~
Posts: 1624
Und statt
Code:
EMAILMESSAGE=`mktemp /tmp/virus-alert.XXXXX`
echo "To: ${EMAIL}" >>  ${EMAILMESSAGE}
echo "From: [email]alert@domain.com[/email]" >>  ${EMAILMESSAGE}
echo "Subject: ${SUBJECT}" >>  ${EMAILMESSAGE}
echo "Importance: High" >> ${EMAILMESSAGE}
echo "X-Priority: 1" >> ${EMAILMESSAGE}
echo "`tail -n 50 ${LOG}`" >> ${EMAILMESSAGE}
sendmail -t < ${EMAILMESSAGE}
könntest du zur besseren Lesbarkeit auch das schreiben:
Code:
EMAILMESSAGE=$(mktemp /tmp/virus-alert.XXXXX)
cat <<-EOF > "${EMAILMESSAGE}"
	To: ${EMAIL}
	From: [email]alert@comain.com[/email]"
	Subject: ${SUBJECT}
	Importance: High
	X-Priority: 1
	$(tail -n 50 ${LOG})
EOF
sendmail -t < "${EMAILMESSAGE}"
Oder auch das ganze mktemp auslassen und gleich
Code:
cat <<-EOF | sendmail -t [...]
schreiben aber da bin ich mir grad ned sicher, kanns ned ausprobieren :D.
Bearbeitet von -=Willi=- am 10.06.2014, 16:43
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz