需求:對一個目錄(好比/data/test)進行監控,當這個目錄下文件或子目錄出現變更(如修改、建立、刪除、改名等操做)時,就發送郵件!
針對上面的需求,編寫shell腳本以下:linux
[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好端口shell
[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])
下面開始測試vim
[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目錄下變更的文件或子目錄信息了centos
經過crontab定時任務,每5分鐘執行一次檢查:bash
[root@centos6-vm01 test]# crontab -e */5 * * * * /bin/bash -x /opt/file_monit.sh > /dev/null 2>&1
以上腳本也能夠用於檢測linux系統重要文件是否被更改,只需將檢查的目錄由腳本中的/data/test改成/etc便可!服務器