linux 通过MD5监控指定路径文件的变动
脚本须知:
1. 运行此脚本的用户必须是root,因为在某些文件所在路径普通用户没有访问权限
2. 源文件和其md5码只要有一方内容有改动,都会导致校验失败,所以校验码的保存就至关重要防止其他人修改,建议修改权限为 root root 600
3. 此脚本带简单的日志功能,方便以后系统安全评估和查看
4.对一个目录下的所有文件做校验,一般有以下几种情况:
1)该目录下文件总的数量没有发生变化,但个别源文件内容发生修改
x文件 --> 改变 --> 记录日志
2)该目录下文件总的数量发生改变
a 新增文件 --> 校验 -->记录日志
b 文件丢失 --> 记录日志 --> 是否删除此文件的MD5校验值
Yes -- (目前此脚本没有提示用户是否要删除丢失源文件校验码,暂时需要手动删除,删不删除需要根据需求)
No -- 找回丢失的源文件重新校验
5. 该脚本目前没有实现告警功能,这个功能模块其实可以通过SendEmail实现,后期补上
6. 校验的文件应该是不经常修改的文件,比如etc下的配置文件,如果校验经常变动的文件没有任何意义,比如日志文件
#!/bin/bash
#
# QQ: 765482322 # 定义MD5文件保存的路径
md5_path=/tmp/md5.sum # 判断MD5基准校验文件是否存在,不存在则创建此文件,并修改权限只有root用户或者指定用户有读写权限
[ ! -f $md5_path ] && touch $md5_path && chmod 600 $md5_path
read -p "请输入你需要MD5检验文件的目录,必须以\"/\"开始: " path
if ! echo $path | grep -q "^/";then echo "不是以\"/\"开始";exit 1;fi echo "#################################################"
# 如果所给需要md5校验的目录不存在,或者目录存在但目录下没有一个文件,则返回错误并提示用户
if [ ! -d $path ] || [ `find $path -type f | wc -l` -eq 0 ];then
echo "错误:路径不存在或者该路径下没有文件"
exit 1
fi
# 判断基准文件数量
for i in `cat /tmp/md5.sum | awk '{print $2}'`;do
[ ! -f $i ] && echo -e "[检测时间:`date +"%Y-%m-%d %T.%N"`] [文件:$i] \033[31m[MD5结果:去除]\033[0m" 2>&1 | tee -a /var/log/md5.log
done for list in `find $path -type f`;do
# echo " list = $list"
new_md5_arg1=`md5sum $list | awk '{print $1}'`
new_md5_arg2=`md5sum $list | awk '{print $2}'`
old_md5_arg2=`awk -v List="$list" '$2 == List{print $2}' $md5_path`
if [[ "$new_md5_arg2" == "$old_md5_arg2" ]];then
old_md5_arg1=`awk -v List="$list" '$2 == List{print $1}' $md5_path`
if [[ ! "$new_md5_arg1" == "$old_md5_arg1" ]];then
echo -e "[检测时间:`date +"%Y-%m-%d %T.%N"`] [文件:$list] \033[31m[MD5结果:改变]\033[0m" 2>&1 | tee -a /var/log/md5.log
else
echo -e "[检测时间:`date +"%Y-%m-%d %T.%N"`] [文件:$list] \033[32m[MD5结果:未改变]\033[0m"
fi
else
md5sum $list >> $md5_path
echo -e "[检测时间:`date +"%Y-%m-%d %T.%N"`] [文件:$list] \033[31m[MD5结果:添加]\033[0m" 2>&1 | tee -a /var/log/md5.log
fi
# 如果文件数量大,可以把sleep的时间间隔设置小点。
sleep 0.2
done
脚本执行展示
第一种情况:校验目录下的文件总数不变,个别文件遭到篡改
对一个新路径下的所有文件做校验,由于第一次校验所以相当于发生改变

记录到日志

再次执行校验:

查看日志,可以看到/etc/sysconfig/network-scripts 路径下没有文件发生改变

模拟篡改一个文件,比如/etc/sysconfig/network-scripts/ifcfg-eth0 追加一行带 # 注释的字符串到其尾部
shell>echo "#hello world" >> /etc/sysconfig/network-scripts/ifcfg-eth0

再次执行脚本校验

可以看到,日志里记录了改变的文件相关信息,以后我们可以通过查看此日志文件,来锁定那些文件被修改,然后根据时间点去大概锁定一个篡改来源
linux 通过MD5监控指定路径文件的变动的更多相关文章
- linux中tar 打包指定路径文件
linux中tar打包指定路径文件www.111cn.net 编辑:yahoo 来源:转载在linux系统中打包与解压文件我都可以使用tar命令来解决,只要使用不同的参数就可以实现不同的需要了,下面来 ...
- Eclipse直接运行算法第4版例子(重定向和读取指定路径文件)
Eclipse直接运行算法第4版例子(重定向和读取指定路径文件) 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://b ...
- java监控指定路径下文件及文件夹变化
之前用jdk7的WatchService API(java.nio.file包)来做目录下的子文件监控,后改为使用commons-io包.主要有下面几点不同:1. WatchService是采用扫描式 ...
- vc++ 监控指定路径下文件变化
参考MSDN文档 https://docs.microsoft.com/zh-cn/windows/desktop/api/winbase/nf-winbase-readdirectorychange ...
- Linux的nmon监控结果分析文件中网络分析NET
1.首先,使用# ifconfig查看Linux系统中的网卡名称,有的是eth0,有的是em1,以查看结果为准,下图为em1 2.先试试Linux系统中有没有安装ethtool工具,没有的话,下载et ...
- Linux Shell:根据指定的文件列表 或 map配置,进行文件位置转移
读取配置文件,进行文件位置转移 在whenb.csv中指定了需要从/home/root/cf/下移除到/home/root/cf_wh/下文件列表,whenb.csv中包含记录如下: enb- enb ...
- C#打开指定路径文件对话框
private string OpenFileDlog(string DeafultDir) { OpenFileDialog Ofd = new OpenFileDialog(); Ofd.AddE ...
- java判断指定路径文件夹是否存在,若不存在则创建新的文件夹
File file = new File(dirPath); if (!file.exists()) { file.mkdirs(); }
- windows上python上传下载文件到linux服务器指定路径【转】
从windows上传文件到linux,目录下的文件夹自动创建 #!/usr/bin/env python # coding: utf-8 import paramiko import datetime ...
随机推荐
- Ajax基础知识梳理
Ajax用一句话来说就是无须刷新页面即可从服务器取得数据.注意,虽然Ajax翻译过来叫异步JavaScript与XML,但是获得的数据不一定是XML数据,现在服务器端返回的都是JSON格式的文件. 完 ...
- java util - 在java代码中执行javascript代码工具 rhino-1.7.7.jar
需要 rhino-1.7.7.jar 包 代码示例: package cn.java.mozilla.javascript; import org.mozilla.javascript.Context ...
- thinkphp 3.2.3 - Dispatcher.class.php 解析(转发器)
class Dispatcher { public static function dispatch() { $varPath = C('VAR_PATHINFO'); // 's' $varAddo ...
- mysql-show processlist之writing to net
mysql提示Writing to net解决 最近发现某一个数据库cpu占用比较过.超过200%了. 首先查看数据库慢日志,设定慢日志5秒,基本上没有产生日,没有超过5秒的语句. show proc ...
- Android 完美解决bundle实现页面跳转并保留之前数据+传值
1.前言 前言: 昨天碰到了一个问题,我想实现页面跳转,采用了Bundle之后,再回到原来的页面,发现数据也没有了, 而且一直报错,网上查找了很多资料,发现要用一个startActivityForRe ...
- Android开发——JVM、Dalvik以及ART的区别
)预编译也可以明显改善电池续航,因为应用程序每次运行时不用重复编译了,从而减少了 CPU 的使用频率,降低了能耗.
- C语言用一维数组打印杨辉三角(原:无意中想到)
本贴地址 ] = { }; a[] = , a[] = ; int i, j,m; ; i <= ; i++) //2-11 输出10行 { ; j > ; j--) //关键在这句,倒着 ...
- TCP/IP网络编程之多进程服务端(二)
信号处理 本章接上一章TCP/IP网络编程之多进程服务端(一),在上一章中,我们介绍了进程的创建和销毁,以及如何销毁僵尸进程.前面我们讲过,waitpid是非阻塞等待子进程销毁的函数,但有一个不好的缺 ...
- angular用$sce服务来过滤HTML标签
angular js的强大之处之一就是他的数据双向绑定这一牛B功能,我们会常常用到的两个东西就是ng-bind和针对form的ng-model.但在我们的项目当中会遇到这样的情况,后台返回的数据中带有 ...
- json对象数据列数
// var len = data.length(); // alert(data.Rows.length); var colCount = (function count(){//一条记录中有几个键 ...