inotify-tools + php脚本实现Linux服务器文件监控并邮件提醒
需求简介:
由于服务器被挂马,经常被写入涉敏感的html网页,领导时常被网监请去喝茶,呵呵你懂的。所以有两个需求,一是找出服务器的木马后门和修复代码漏洞,二是监控服务器涉及增删改查的文件。
第一个不在此次探讨行列,故只说第二个需求。
inotify简介:
Inotify 是一个 Linux特性,它监控文件系统操作,比如读取、写入和创建。Inotify 反应灵敏,用法非常简单,并且比 cron 任务的繁忙轮询高效得多。学习如何将 inotify 集成到您的应用程序中,并发现一组可用来进一步自动化系统治理的命令行工具。(来自百度百科inotify)
以下,我们开始安装inotify-tools。
yum install make gcc gcc-c++ #安装编译工具
cd /usr/local/src tar -zxvf inotify-tools-3.14.tar.gz #解压 cd inotify-tools-3.14 #进入解压目录 ./configure --prefix=/usr/local/inotify #配置 make #编译 make install #安装
echo "PATH=/usr/local/inotify/bin:$PATH" >>/etc/profile.d/inotify.sh source /etc/profile.d/inotify.sh #使设置立即生效 echo "/usr/local/inotify/lib" >/etc/ld.so.conf.d/inotify.conf ln -s /usr/local/inotify/include /usr/include/inotify
执行以下命令查看结果: sysctl -a | grep max_queued_events #结果是:fs.inotify.max_queued_events = sysctl -a | grep max_user_watches #结果是:fs.inotify.max_user_watches = sysctl -a | grep max_user_instances #结果是:fs.inotify.max_user_instances = #修改上述参数为下列值 sysctl -w fs.inotify.max_queued_events="" sysctl -w fs.inotify.max_user_watches="" sysctl -w fs.inotify.max_user_instances="" #修改方法 vi /etc/sysctl.conf #添加以下代码 fs.inotify.max_queued_events= fs.inotify.max_user_watches= fs.inotify.max_user_instances= wq! #保存退出
mkdir -p /home/inotify #创建目录 vim /home/inotify/inotif.sh #编辑并添加以下内容 #!/bin/sh
/usr/local/inotify/bin/inotifywait -mrq -e modify,create,move,delete --fromfile '/home/inotify/excludedir' --timefmt '%y-%m-%d %H:%M' --format '%T %f %e'
/data/rise/ >> /tmp/rsync.txt wq! #保存退出 vim /home/inotify/excludedir #编辑并添加以下内容 /data/rise/ #要监控的目录
@/data/rise/cache/ #要排除监控的目录 wq! #保存退出 chmod +x /home/inotify/inotif.sh #添加执行权限 vim /etc/rc.d/rc.local #编辑并在最后一行添加以下内容,开机自动启动 sh /home/inotify/inotif.sh wq! #保存退出 reboot重启生效
/usr/local/inotify/bin/inotifywait -m -r -d -o /tmp/file_change.log --timefmt '%F %T' --format '%T %w%f %e' -e close_write -e create /data/riseweb/ @/data/riseweb/data/ @/data/riseweb/riseimg/
命令解析:
/tmp/file_change.log 是日志路径,生成的日志写在这里面。
/data/riseweb/ 是监控的文件目录,后面两个@是要排除监控的目录。
四、使用PHP脚本监测并发送邮件
实现思路:
在/tmp文件夹下新建一个row_mark.txt的文件,用来保存上一次的file_change.log的最后行数,在crontab中定时执行php脚本,获取file_change.log的最后行数,与row_mark文件最后保存的行数做对比,数字一致,说明没有新增操作日志。不一致,说明有新增操作日志,读取新行数与旧行数之间的日志内容,排版发送邮件,并把新行数写入row_mark.txt文件。
实现的php脚本代码:
<?php
/**
* Created by PhpStorm.
* User: jimmyRen
* Date: 16/10/24
* Time: 下午1:56
* 主要作用:检查服务器项目目录下是否有新建文件或文件夹,如果有,发送邮件通知
* 实现思路:服务器如有新建文件,inotify会写在/tmp/file_change.log里,打开文件,获取最后一行的行数,如果大于0或大于上一次保存的行数,则追加写进行数文件中,并发送邮件通知
*/ require_once(dirname(__FILE__)."/include/common.inc.php");
date_default_timezone_set("PRC");
$url = '/tmp/';
//打开日志文件
$change_log = file_get_contents($url.'file_change.log');
//打开记录行数的文件
$row_log = file_get_contents($url.'row_mark.log');
//将文件以每行转换成数组
$change_array = explode("\n",$change_log);
$row_array = explode("\n",$row_log);
//获取数组的总长度
$change_count = count($change_array);
$row_count = count($row_array);
//获取日志文件最后一行的key[行数]
$change_row = $change_count - 2;
//获取行数文件最后一行的值
$row_value = substr($row_array[$row_count-1],0,strpos($row_array[$row_count-1],"[")); $row_date = date("Y-m-d H:i:s",time());
if($change_row > 0 && $row_log== ""){//第一次写行数日志
$file_write = file_put_contents($url.'row_mark.log',$change_row."[".$row_date."]",FILE_APPEND);
echo "首次写入记录成功";exit;
}elseif($change_row > 0 && $change_row > $row_value){
$file_write2 = file_put_contents($url.'row_mark.log',"\n".$change_row."[".$row_date."]",FILE_APPEND);
}else{
echo "当前时间".date("Y-m-d H:i:s", time())." 没有新写入的文件";
exit;
} //有新写入的行数,把日志新写入的内容循环取出来,生成文件,然后发送email
if($file_write2){
ini_set("memory_limit","512M");
$new_array = array();
for($i = $row_value;$i<$change_row;$i++){
$new_array[] = "\n\r\n".$change_array[$i];
}
//把拿到的数组转换成行数格式的字符串
$text = implode("\n\r\n",$new_array);
$file_time = date("Y-m-d_H:i");
//把内容生成文件
$file = fopen($url."checkChangeLog".$file_time.".txt","w+");
if($file){
iconv("UTF-8","GB2312//IGNORE",$text);
$write = fwrite($file,$text);
}
fclose($file); //发送邮件
function sendmail($email, $mailtitle, $mailbody)
{
global $cfg_sendmail_bysmtp, $cfg_smtp_server, $cfg_smtp_port, $cfg_smtp_usermail, $cfg_smtp_user, $cfg_smtp_password, $cfg_adminemail,$cfg_webname;
if($cfg_sendmail_bysmtp == 'Y' && !empty($cfg_smtp_server))
{
$mailtype = 'TXT';
require_once(DEDEINC.'/mail.class.php');
$smtp = new smtp($cfg_smtp_server,$cfg_smtp_port,true,$cfg_smtp_usermail,$cfg_smtp_password);
$smtp->debug = false;
if(!$smtp->smtp_sockopen($cfg_smtp_server)){
ShowMsg('邮件发送失败,请联系管理员','-1');
exit();
}
$smtp->sendmail($email,$cfg_webname,$cfg_smtp_usermail, $mailtitle, $mailbody, $mailtype);
}else{
@mail($email, $mailtitle, $mailbody, $headers);
}
} $email = "906691xxx.qq.com"; //这里填写要发送到的邮箱
$mailtitle = date("Y-m-d H:i", time())." rise文件写入情况";
$mailbody = $text;
sendmail($email, $mailtitle, $mailbody);
echo "脚本执行成功!";exit; }
tip:记得加载发送邮件的class。
五、crontab定时任务
要求是每天的0 - 7点,每5个小时执行一次,7 - 21点,每1个小时执行一次,21 - 23点,每2个小时执行一次,故crontab脚本命令如下。
#定时检查服务器文件写入情况并发送邮件通知
-/,-/,-/ * * * php /data/rise/checkfile.php
六、总结
需求肯定是实现了,由于不是专业的运维,本次只是实现了需求,大神们有更好的方法可交流探讨。
inotify-tools + php脚本实现Linux服务器文件监控并邮件提醒的更多相关文章
- nmon脚本——对Linux服务器的监控
继服务器被挖之后,我又开拓了另一个监控工具----nmon! Nmon可以很轻松的监控系统的CPU.内存.网络.硬盘.文件系统.NFS.高耗进程.资源和IBM Power系统的微分区的信息,还有专属的 ...
- Python 脚本实现对 Linux 服务器的监控
本文来自我的github pages博客http://galengao.github.io/ 即www.gaohuirong.cn 摘要: 原文地址 由于原文来自微信公众号,并且脚本都是图片,所以这里 ...
- 用 Python 脚本实现对 Linux 服务器的监控
目前 Linux 下有一些使用 Python 语言编写的 Linux 系统监控工具 比如 inotify-sync(文件系统安全监控软件).glances(资源监控工具)在实际工作中,Linux 系统 ...
- Linux 服务器系统监控脚本 Shell【转】
转自: Linux 服务器系统监控脚本 Shell - 今日头条(www.toutiao.com)http://www.toutiao.com/i6373134402163048961/ 本程序在Ce ...
- Linux入门(五)linux服务器文件远程管理
1 使用filezila远程管理linux服务器文件 filezila下载地址:https://filezilla-project.org/ filezila默认只能登录普通用户,如果想要root用 ...
- Shell脚本对Linux进行文件校验
Shell脚本对Linux进行文件校验 一.需求 有客户等保需求对文件一致性进行校验,想到利用md5sum工具,因此写脚本来对文件进行自定义扫描,后期可以利用其进行校验,快速校验文件发现变更的文件,一 ...
- Inotify: 高效、实时的Linux文件系统事件监控框架
Inotify: 高效.实时的Linux文件系统事件监控框架 概要 - 为什么需要监控文件系统? 在日常工作中,人们往往需要知道在某些文件(夹)上都有那些变化,比如: 通知配置文件的改变 ...
- Linux服务器上监控网络带宽的18个常用命令 zz
Linux服务器上监控网络带宽的18个常用命令 本文介绍了一些可以用来监控网络使用情况的Linux命令行工具.这些工具可以监控通过网络接口传输的数据,并测量目前哪些数据所传输的速度.入站流量和出站流量 ...
- Linux服务器上监控网络带宽的18个常用命令和工具
一.如何查看CentOS的网络带宽出口 检查维护系统的时候,经常会要查看服务器的网络端口是多大的,所以需要用到Linux的一个命令. 如何查看CentOS的网络带宽出口多大?可以用下面的命令来查看. ...
随机推荐
- 201521123071《java程序设计》第三周学习总结
1. 本周学习总结 这周主要学习了构造函数,类与对象,就是这周事情很多,还没来得及好好复习,所以有很多知识都没有认识透彻.但我会尽力补上的. http://images2015.cnblogs.com ...
- 201521123029《Java程序设计》第1周学习总结
1. 本周学习总结 1.认识了Java的发展: 2.Java语言的特点,简单性和结构中立: 3.了解到了JDK.JRE,JVM: 4.学习Java数据类型分类,如整形,char型等. 2. 书面作业 ...
- 201521123098 《Java程序设计》第13周学习总结
1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 1. TCP的特征: ①可靠:具有失败重传的功能: ②开销大:需要建立通路以维持通信: ③控制能力较强:有 ...
- 201521123098 《Java程序设计》第12周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 1. Input Stream -- 数据提供者可从其中读数据输出流:Output Stream -- 数据接 ...
- Java课程设计博客(个人)
Java课程设计博客(个人) 1. 团队课程设计博客链接 http://www.cnblogs.com/wkfg/p/7063081.html 2. 个人负责模块或任务说明 负责模块/任务:编写doG ...
- 201521123013 《Java程序设计》第11周学习总结
1. 本章学习总结 2. 书面作业 Q1.1.互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) 1.1 除了使用synchronized修饰方法实现互斥同步访问,还有什么办法实现互斥 ...
- 201521123029《Java程序设计》第十三周学习总结
1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 2. 书面作业 1.网络基础 1.1 比较ping www.baidu.com与ping cec.jmu. ...
- SVM原理以及Tensorflow 实现SVM分类(附代码)
1.1. SVM介绍 1.2. 工作原理 1.2.1. 几何间隔和函数间隔 1.2.2. 最大化间隔 - 1.2.2.0.0.1. \(L( {x}^*)\)对$ {x}^*$求导为0 - 1.2.2 ...
- PHP中public、protected、private权限修饰符
PHP中有三种访问修饰符 默认是public public(公共的.默认) protected(受保护的) private(私有的) 访问权限 public protected private 类内 ...
- Spark官方2 ---------Spark 编程指南(1.5.0)
概述 在高层次上,每个Spark应用程序都由一个运行用户main方法的driver program组成,并在集群上执行各种 parallel operations.Spark提供的主要抽象是resil ...