shell指令碼,判斷目錄是否被修改

2020-08-08 19:07:38

此指令碼用於檢測linux系統重要檔案是否被改動,如果發生改動則發送郵件通知進行報警

#!/bin/bash
FileDir='/var/CheckFile' #定義驗證檔案所在目錄
HostName=$(hostname) #獲取主機名或自己定義

Mail_Smtp="smtp.163.com" #smtp地址,我這裏用的網易郵箱
Mail_User="[email protected]" #使用者
Mail_Pass="USRMVWXLCUQTAYCK" #授權密碼
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
}

#生成所定義檔案新日誌函數(注意後面發送郵件內容,\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

建立測試目錄及檔案

[root@localhost ~]# mkdir -p /data/test
[root@localhost ~]# cd /data/test/
[root@localhost test]# mkdir aaa
[root@localhost test]# cd aaa/
[root@localhost aaa]# echo hello > bbb
[root@localhost aaa]# ll
total 4
-rw-r--r-- 1 root root 6 Aug  8 17:32 bbb

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

[root@localhost ~]# ll -d /var/CheckFile/
drwxr-xr-x 2 root root 72 Aug  8 17:33 /var/CheckFile/
[root@localhost ~]# ll /var/CheckFile/
total 4
-rw-r--r-- 1 root root  0 Aug  8 17:33 diff2020-08-08__17:33:09.log
-rw-r--r-- 1 root root  0 Aug  8 17:33 new.log
-rw-r--r-- 1 root root 53 Aug  8 17:33 old.log
[root@localhost ~]# cat /var/CheckFile/diff2020-08-08__17\:33\:09.log
[root@localhost ~]# cat /var/CheckFile/new.log
[root@localhost ~]# cat /var/CheckFile/old.log
b1946ac92492d2347c6235b4d2611184  /data/test/aaa/bbb

對測試目錄下進行修改,生成兩個新檔案

[root@localhost ~]# echo nihao > /data/test/ccc.txt
[root@localhost ~]# echo linux > /data/test/ddd.txt

執行指令碼,報警郵件已經發送

[root@localhost ~]# sh check.sh
Aug 08 17:36:36 localhost sendEmail[65921]: Email was sent successfully!
[root@localhost ~]# ll /var/CheckFile/
total 8
-rw-r--r-- 1 root root   0 Aug  8 17:33 diff2020-08-08__17:33:09.log
-rw-r--r-- 1 root root 116 Aug  8 17:36 diff2020-08-08__17:36:36.log
-rw-r--r-- 1 root root   0 Aug  8 17:36 new.log
-rw-r--r-- 1 root root 159 Aug  8 17:36 old.log
[root@localhost ~]# cat /var/CheckFile/diff2020-08-08__17\:36\:36.log
2,3d1
< 0a34a9366d438e6ac5ae3480d024c4ef  /data/test/ccc.txt
< 5bb062356cddb5d2c0ef41eb2660cb06  /data/test/ddd.txt
[root@localhost ~]# cat /var/CheckFile/old.log
b1946ac92492d2347c6235b4d2611184  /data/test/aaa/bbb
0a34a9366d438e6ac5ae3480d024c4ef  /data/test/ccc.txt
5bb062356cddb5d2c0ef41eb2660cb06  /data/test/ddd.txt
[root@localhost ~]# cat /var/CheckFile/new.log
[root@localhost ~]# 

網易郵箱已收到郵件
在这里插入图片描述

建議用定時任務執行此指令碼,如每5分鐘執行一次,也可修改此指令碼用於死回圈檢測

[root@localhost ~]# crontab -e
*/5 * * * *  /bin/bash -x /root/check.sh > /dev/null 2>&1

此指令碼也可以用於檢測linux系統重要檔案是否被更改,如組態檔等,只需將檢查的目錄由指令碼中的/data/test改爲對應目錄即可