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 ...
随机推荐
- php下关于Cannot use a scalar value as an array的解决办法
今天在测试php程序的时候,出现了一个错误提示:Cannot use a scalar value as an array,这个错误提示前几天也出过,当时好像稍微调了一下就好了,也没深究,今天却又出现 ...
- JZOJ 4307. 喝喝喝
Description
- 动态规划:HDU-1398-Square Coins(母函数模板)
解题心得: 1.其实此题有两种做法,动态规划,母函数.个人更喜欢使用动态规划来做,也可以直接套母函数的模板 Square Coins Time Limit: 2000/1000 MS (Java/Ot ...
- 异步消息处理机制,UI更新
UI只能在主线程中完成更新,在子线程中更新UI报错如下 Only the original thread that created a view hierarchy can touch its vie ...
- 配置Spring.NET
先引入关键的程序集 Common.Logging.dll Spring.Core.dll 在配置文件配置中: <configSections> ...... <sectionGrou ...
- TypeError: cannot perform reduce with flexible type
想要解决这个错误,最好先明白numpy数据类型的dtype转换 生成一个浮点数组 a=np.random.random(4) 输出 a array([0.0945377,0.52199916,0.62 ...
- Windows Server 2012之活动目录域服务的卸载
Windows Server 2012之活动目录域服务的卸载 2012-07-11 06:27:35 标签:Windows Server 2012 活动目录域服务 卸载 原创作品,允许转载,转载时请务 ...
- 04 JVM是如何执行方法调用的(下)
虚方法调用 Java 里所有非私有实例方法调用都会被编译成 invokevirtual 指令,而接口方法调用会被编译成 invokeinterface 指令.这两种指令,均属于 Java 虚拟机中的虚 ...
- Leetcode 503.下一个更大元素
下一个更大元素 给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素.数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你 ...
- mysql的下载及配置(复制1)
---恢复内容开始--- MySQL数据库安装与配置详解 目录 一.概述 二.MySQL安装 三.安装成功验证 四.NavicatforMySQL下载及使用 一.概述 MySQL版本:5.7.17 下 ...