判断目录是否被修改——shell脚本

此脚本用于检测linux系统重要文件是否被改动,如果发生改动则发送邮件通知进行报警

#!/bin/bash
#sehn
FileDir='/var/CheckFile' #定义验证文件所在目录
HostName=$(hostname) #获取主机名或自己定义

Mail_Smtp="smtp.163.com" #smtp地址,我这里用的网易邮箱
Mail_User="[email protected]" #用户
Mail_Pass="USRMVWXLCUQTAYGT" #授权密码
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 ~]# 

网易邮箱已收到邮件
判断目录是否被修改——shell脚本_第1张图片

建议用定时任务执行此脚本,如每5分钟执行一次,也可修改此脚本用于死循环检测

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

此脚本也可以用于检测linux系统重要文件是否被更改,如配置文件等,只需将检查的目录由脚本中的/data/test改为对应目录即可

你可能感兴趣的:(脚本)