1. 程式人生 > >linux下監控某個目錄是否被更改

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

oca tro menu tel .cn net mtime 接收 建議

需求:對一個目錄(比如/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="[email protected]"
Mail_Pass="notice@123"
Mail_From="[email protected]"
Mail_To="[email protected]"
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
}

#生成所定義文件新日誌函數
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
}
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即可!

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