Linux bash: uno script per monitorare le modifiche ai file di una directory

by: spadamar25-10-2015

rodentia-icons_utilities-terminalQuesto piccolo script bash serve a monitorare le modifiche fatte ai file in una certa directory, confrontandoli con una directory di controllo che contenga i file originali.

Ammettiamo di voler avere una notifica dei cambiamenti che vengono effettuati da terzi in una serie di file residenti in una particolare cartella del FS. Per prima cosa creiamo una nuova cartella in qualche parte del filesystem che contenga i file originali per confrontarli con quelli della directory di lavoro.

Qundi prepariamo questo script:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#!/bin/bash
PATH_OK="/path/directory/controllo"
PATH_TO_CHECK="/path/directory/lavoro"
CHANGES=0
for entry in "$PATH_OK"/*
do
	toCheck=$(echo "$entry" | rev | cut -d"/" -f1 | rev)
	echo "Processing $toCheck"
	MD5_1=_$(md5sum $entry | cut -d ' ' -f 1)
	MD5_2=_$(md5sum $PATH_TO_CHECK/$toCheck | cut -d ' ' -f 1)
	if [[ "$MD5_1" != "$MD5_2" ]]
	then
		echo "FILE $toCheck has been modified!"
		CHANGES=$((CHANGES+1))
		diffText=$(diff $entry $PATH_TO_CHECK/$toCheck)
		mail -s "FILE $toCheck has been modified!" webmaster@domain.com <<< "Changes in $toCheck: $diffText"
		#Se vogliamo possiamo ripristinare il file modificato con il controllo
                #/bin/cp -f "$entry" "$PATH_TO_CHECK/$toCheck"
	fi
done
echo "CHANGES= $CHANGES"
#		if [ "$CHANGES" -gt 0 ]
#		then
# Qui possiamo inserire un comando da lanciare nel caso ci siano stati cambiamenti a uno o più files
#			echo "CHANGES greater then 0!"
#		fi

In pratica lo script scorre tutti i files nella directory di controllo, fa l’MD5 sia del file di controllo che di quello di lavoro, li confronta e se ci sono state modifiche invia una mail a: webmaster@domain.com (da modificare secondo le proprie esigenze…) riportando anche il dettaglio delle modifiche fatte utilizzando il comando diff. E’ anche possibile, nel caso lo si desideri, ripristinare il file modificato con quello di controllo decommentando la riga: /bin/cp -f "$entry" "$PATH_TO_CHECK/$toCheck"
Vengono anche conteggiati i file modificati in modo che si possa decidere di lanciare un comando particolare nel caso uno o più files siano stati modificati.
Lo script può essere utile per monitorare cambiamenti indesiderati in file di configurazione di servizi.
Ovviamente lo script andrà inserito sotto cron per essere eseguito periodicamente. In questo articolo (in inglese) è spiegato chiaramente come inserire un “job” in cron.