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