需求:對一個目錄(比如/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即可!
