linux下監控某個目錄是否被更改

散盡浮華發表於2018-01-10

 

需求:對一個目錄(比如/data/test)進行監控,當這個目錄下檔案或子目錄出現變動(如修改、建立、刪除、更名等操作)時,就傳送郵件!
針對上面的需求,編寫shell指令碼如下:

[root@centos6-vm01 opt]# vim file_monit.sh
#!/bin/bash
#此指令碼用於檢測linux系統重要檔案是否被改動,如果改動則用郵件報警
#建議用定時任務執行此指令碼,如每5分鐘執行一次,也可修改此指令碼用於死迴圈檢測
#Ver:1.0
#http://www.cnblogs.com/kevingrace

#定義驗證檔案所在目錄
FileDir='/var/CheckFile'

#獲取主機名或自己定義
HostName=$(hostname)

#定義郵件引數:xmtp地址,傳送郵件帳號,傳送郵件密碼,接收郵件地址,郵件主題,郵件內容
Mail_Smtp="smtp.wangshibo.com"
Mail_User="notice@wangshibo.com"
Mail_Pass="notice@123"
Mail_From="notice@wangshibo.com"
Mail_To="wangshibo@wangshibo.com"
Mail_Subject="${HostName}:There are changes to system files"
Mail_Conntent="${HostName}:There are changes to system files"

#定義需要驗證的檔案目錄。這裡我監控的是/data/test目錄
CheckDir=(
/data/test
)

#生成所定義需驗證的檔案樣本日誌函式
OldFile () {
for i in ${CheckDir[@]}
do
/bin/find ${i} -type f |xargs md5sum >> ${FileDir}/old.log
done
}
NewFile () {
for i in ${CheckDir[@]}
do
/bin/find ${i} -type f |xargs md5sum >> ${FileDir}/new.log
done
}

#生成所定義檔案新日誌函式(注意後面傳送郵件內容,\n表示換行)
SendEMail () {
/usr/local/bin/sendEmail -f $Mail_From -t $Mail_To -s $Mail_Smtp -u $Mail_Subject -xu $Mail_User -xp $Mail_Pass -m "$Mail_Conntent"\n
}
if [ ! -d ${FileDir} ]
then
mkdir ${FileDir}
fi

#假如驗證檔案目錄不存在則建立
if [ ! -f ${FileDir}/old.log ]
then
OldFile
fi

#假如沒有安裝sendEmail則安裝
if [ ! -f /usr/local/bin/sendEmail ]
then
cd /usr/local/src/
wget http://caspian.dotconf.net/menu/Software/SendEmail/sendEmail-v1.56.tar.gz
tar -xf sendEmail-v1.56.tar.gz
cd sendEmail-v1.56
cp sendEmail /usr/local/bin
chmod 0755 /usr/local/bin/sendEmail
fi

#生成新驗證日誌
NewFile

#新驗證日誌與樣本日誌進行比較
/usr/bin/diff ${FileDir}/new.log ${FileDir}/old.log >${FileDir}/diff.log
Status=$?

#假如比較結果有變化,則傳送郵件報警
if [ ${Status} -ne 0 ]
then
Mail_Conntent="$(grep '<' ${FileDir}/diff.log |awk '{print $3}')"
SendEMail
fi

#清除新舊日誌,把比較結果進行備份
/bin/mv -f ${FileDir}/diff.log ${FileDir}/diff$(date +%F__%T).log
cat /dev/null > ${FileDir}/old.log
cat /dev/null > ${FileDir}/new.log

#重新生成樣本日誌
OldFile

#刪除目錄內30天以前的比較結果備份檔案
/bin/find ${FileDir} -type f -mtime +30 |xargs rm -f

確保本機能連上shell指令碼中指定的smtp伺服器的25好埠

[root@centos6-vm01 opt]# telnet smtp.wangshibo.com 25
Trying 223.252.214.65...
Connected to smtp.wangshibo.com.
Escape character is '^]'.
220 icoremail.net Anti-spam GT for Coremail System (icoremail-gateway-smtp[20170531])

下面開始測試

[root@centos6-vm01 test]# cd /opt/
[root@centos6-vm01 opt]# cd /data/test/
[root@centos6-vm01 test]# ll
total 0
[root@centos6-vm01 test]# mkdir haha
[root@centos6-vm01 test]# echo "123456" > haha/heihei
[root@centos6-vm01 test]# ll
total 4
drwxr-xr-x. 2 root root 4096 Jan 10 01:42 haha
[root@centos6-vm01 test]# echo "abcdef" > test.txt
[root@centos6-vm01 test]# ll
total 8
drwxr-xr-x. 2 root root 4096 Jan 10 01:42 haha
-rw-r--r--. 1 root root    7 Jan 10 01:42 test.txt

執行監控指令碼
[root@centos6-vm01 test]# sh -x /opt/file_monit.sh

注意:當首次執行指令碼的時候,由於所監控的目錄下的檔案沒有變動,所以不會傳送郵件!

檢視對比後的日誌
[root@centos6-vm01 test]# ll -d /var/CheckFile/
drwxr-xr-x. 2 root root 4096 Jan 10 01:44 /var/CheckFile/
[root@centos6-vm01 test]# ll /var/CheckFile/
total 4
-rw-r--r--. 1 root root   0 Jan 10 01:44 diff2018-01-10__01:44:30.log
-rw-r--r--. 1 root root   0 Jan 10 01:44 new.log
-rw-r--r--. 1 root root 166 Jan 10 01:44 old.log

[root@centos6-vm01 test]# cat /var/CheckFile/diff2018-01-10__01\:44\:30.log 
[root@centos6-vm01 test]# cat /var/CheckFile/new.log                        
[root@centos6-vm01 test]# cat /var/CheckFile/old.log 
237267ea7fefa88360c22ab6fd582d7e  /data/test/.hhhh.swp
5ab557c937e38f15291c04b7e99544ad  /data/test/test.txt
f447b20a7fcbf53a5d5be013ea0b15af  /data/test/haha/heihei


==============================================================================================================================
現在開始對/data/test目錄下的檔案做下變動
[root@centos6-vm01 test]# echo "aaaaaa" >> test.txt 
[root@centos6-vm01 test]# touch haha/bobo
[root@centos6-vm01 test]# mkdir heihei
[root@centos6-vm01 test]# ll
total 12
drwxr-xr-x. 2 root root 4096 Jan 10 01:47 haha
drwxr-xr-x. 2 root root 4096 Jan 10 01:47 heihei
-rw-r--r--. 1 root root   14 Jan 10 01:47 test.txt

執行監控指令碼
[root@centos6-vm01 test]# sh -x /opt/file_monit.sh 


檢視對比後的日誌
[root@centos6-vm01 test]# ll /var/CheckFile/
total 8
-rw-r--r--. 1 root root   0 Jan 10 01:44 diff2018-01-10__01:44:30.log
-rw-r--r--. 1 root root 179 Jan 10 01:47 diff2018-01-10__01:47:41.log
-rw-r--r--. 1 root root   0 Jan 10 01:47 new.log
-rw-r--r--. 1 root root 221 Jan 10 01:47 old.log
[root@centos6-vm01 test]# cat /var/CheckFile/diff2018-01-10__01\:47\:41.log 
2,3c2
< 4533551682ca49b2f9b1f2829bf3b29d  /data/test/test.txt
< d41d8cd98f00b204e9800998ecf8427e  /data/test/haha/bobo
---
> 5ab557c937e38f15291c04b7e99544ad  /data/test/test.txt

[root@centos6-vm01 test]# cat /var/CheckFile/old.log 
237267ea7fefa88360c22ab6fd582d7e  /data/test/.hhhh.swp
4533551682ca49b2f9b1f2829bf3b29d  /data/test/test.txt
d41d8cd98f00b204e9800998ecf8427e  /data/test/haha/bobo
f447b20a7fcbf53a5d5be013ea0b15af  /data/test/haha/heihei

通過上面的diff日誌,可以看到新變動的檔案或子目錄已經記錄到日誌裡了。

檢視郵件,就能看到/data/test目錄下變動的檔案或子目錄資訊了

通過crontab定時任務,每5分鐘執行一次檢查:

[root@centos6-vm01 test]# crontab -e
*/5 * * * *  /bin/bash -x /opt/file_monit.sh > /dev/null 2>&1

以上指令碼也可以用於檢測linux系統重要檔案是否被更改,只需將檢查的目錄由指令碼中的/data/test改為/etc即可!

相關文章