linux下监控某个目录是否被更改

散尽浮华 散尽浮华     2022-10-09     596

关键词:

 

需求:对一个目录(比如/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——grep命令查找目录下的所有文件中是否含有某个字符串(代码片段)

linux查找目录下的所有文件中是否含有某个字符串[root@wuseyukui]#grep-rn"runlog"*说明:-r是递归查找-n是显示行号*:表示当前目录所有文件,也可以是某个文件名 查看详情

shell脚本,如何监控目录下的文件内容是否被修改。

第一种方法是通过cmp来进行比对[[email protected]bo]#ls1.html2.html3.html4.html5.html6.html7.html8.html9.htmlcat.sh[[email protected]bo]#catcat.sh#!/bin/bash[!-f/root/wyb/bo/cat.log]&&cat*.html> 查看详情

在linux下使用inotify监控,能不能够知道监控目录下子目录中是哪个文件被修改了。。。求方法。。。

...个文件就没法得知了这个我们期末考试考过。inotify只能监控单层目录变化,不能监控子目录中的变化情况。如果需要监控子目录,需要在调用inotify_add_watch(intfd,char*dir,intmask):int建立监控时,递归建立子目录的监控,伪代码如下vo... 查看详情

linux怎么压缩某个目录下的所有文件

比如你想把data目录下所有文件压缩打包到/tmp目录下,并且把压缩包命名为a.tar.gz。可以这样操作tar-zcvf/tmp/a.tar.gzdata/然后你进到/tmp目录下看下是否打包成功,有这个a.tar.gz,并检查是是否打包完整。cd/tmptar-tfa.tar.gz参考技术ALinux... 查看详情

linux中如何查看某个端口是否被占用

之前查询端口是否被占用一直搞不明白,问了好多人,终于搞懂了,现在总结下:1.netstat -anp |grep 端口号如下,我以3306为例,netstat -anp |grep 3306(此处备注下,我是以普通用户操作,故加上了sudo,如果是... 查看详情

linux查找目录下的所有文件中是否含有某个字符串(代码片段)

...-R"some_code"YOUR_DIR 如果你不需要显示内容,只需要含有某个字符的文件: 1grep-lR"some_code"YOUR_DIR 附录: gre 查看详情

linux下监控某个进程

应用场景:经常发生某个进程宕机,例如Rsync服务                实验环境:CentOS7实验脚本:          &n 查看详情

jenkins怎么监控linux性能

jenkins不能监控linux性能,jenkins是分布式调用的软件,可以定时执行任务,可以按要求顺序执行脚本,但是本身不带监控性能的功能,如果要监控linux的性能,应该用nagios。nagios监控linux性能服务器搭建详解:配置安装环境-----搭... 查看详情

zabbix企业应用之监控动作是否有被关闭

当前我监控1000+的服务器,动作有近200个,监控方式有短信、邮件与语音报警电话,如果动作配置有问题或者某个动作被关闭,就会导致某些报警无法触发,不能及时收到报警通知并处理。而且zabbix配置用户权限的时候,如果给... 查看详情

linux系统目录结构

...etc:这个是系统中的配置文件,如果你更改了该目录下的某个文件可能会导致系统不能启动。/bin,/sbin,/usr/bin,/usr/sbin: 这是系统预设的执行文件的放置目录,比如 ls 就是在/bin/l 查看详情

查看linux中某个端口(port)是否被占用

1.使用lsof lsof-i:端口号查看某个端口是否被占用 2.使用netstat 使用netstat-anp|grep80   查看详情

查看linux中某个端口port是否被利用

(1)lsof-i:端口号查看某个端口是否被占用      (2)netstat-an|grep80netstat--shownetworkstatus killpid 查看详情

linux更改文件及目录权限问题

1.快速实例学习修改某个目录下的所有文件的权限,包括子目录中的文件,例子如下:#chmod777/home/user注:仅把/home/user目录的权限设置为rwxrwxrwx#chmod-R777/home/user注:表示将整个/home/user目录与其中的文件和子目录的权限都设置为rwxr... 查看详情

linux下如何监听进程

...态。一、superviseSupervise是daemontools的一个工具,可以用来监控管理unix下的应用程序运行情况,在应用程序出现异常时,supervise可以重新启动指定程序。使用:mkdirtestcdtestvimrun写入希望执行的操作supervisetest(注意这里是的参数是run... 查看详情

使用filesystemwatcher时怎么处理大文件

...atcher基础属性:Path——这个属性告诉FileSystemWatcher它需要监控哪条路径。例如,如果我们将这个属性设为“C:\test”,对象就监控test目录下所有文件发生的所有改变(包括删除,修改,创建,重命名)。IncludeSubDirectories——这... 查看详情

linux中在当前目录下查找某个文件

...baidu.com/question/1512088073851955780.htmlLinux中在当前目录下查找某个文件可以使用find命令。1、比如在/usr/lib下查找klibc的文件,进入/usr/lib目录后,可以执行find . -name "klibc"说明:find命令用于查找文件,后面的“."代表当前目... 查看详情

linux下查找某个目录下的具体目录,删除过期文件(代码片段)

删除当前目录下的所有超过90天的log文件1#!/bin/sh23echo"beforeremovelog"4du--max-depth=1-h5echo"------------------------------------------------------------------------------------------------"6#del 查看详情

java利用watchservice实时监控某个目录下的文件变化并按行解析(注:附源代码)

...传约定格式的文件到服务器指定目录下,应用程序能实时监控该目录下文件变化,如果上传的文件格式符合要求,将将按照每一行读取解析再写入到数据库,解析完之后再将文件改名。一.一开始的思路  设置一个定时任务,... 查看详情