linux下监控某个目录是否被更改
Posted 散尽浮华
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux下监控某个目录是否被更改相关的知识,希望对你有一定的参考价值。
需求:对一个目录(比如/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即可!
以上是关于linux下监控某个目录是否被更改的主要内容,如果未能解决你的问题,请参考以下文章
在linux下使用inotify监控,能不能够知道监控目录下子目录中是哪个文件被修改了。。。求方法。。。
如何在没有监控线程或进程的情况下使用 C++ 快速获取目录是不是已更改?
Android 逆向Linux 文件权限 ( Linux 权限简介 | 系统权限 | 用户权限 | 匿名用户权限 | 读 | 写 | 执行 | 更改组 | 更改用户 | 粘滞 )(代码片段