Linux-通过inotifywait监控目录及文件

inotifywait命令的使用此处就不写了;可以参考文章:https://www.cnblogs.com/martinzhang/p/4126907.html

inotifywait命令是工具包 inotify-tools 里面的,可以直接通过yum安装 yum install inotify-tools -y

此处通过inotifywait监控某个目录及里面的文件,(create、delete、modify)。通过Python发送邮件告知:

(1)编写邮件脚本/tmp/mail.py

# !/usr/bin/env python
# -*- coding:utf-8 -*-
# Date:2019-02-13
# Desc: 用于发送邮件脚本,使用方法:python3.6 脚本名字(mail.py) 主题 邮件内容 附件路径
# By:yanjieli
# Email:381347268@qq.com # 引入相应的模块
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.multipart import MIMEBase
from email import encoders
from email.utils import parseaddr, formataddr
import sys class SendMail(object):
def __init__(self):
self.fromUser = "******@qq.com"
self.userPasswd = "vpqnntvrrflibghe" # 此处是qq邮箱授权码, 不是登录密码
self.smtpAddr = "smtp.qq.com" # 构造邮件结构
# toAddrs 收件人可以是多个,["xxx@qq.com","xxx@qq.com"], subject 邮件的主题, msg 邮件的内容
def mailStructure(self, toAddrs, subject, msg, filePath):
# 邮件对象:
mailMsg = MIMEMultipart()
mailMsg['Subject'] = ("Hello Administrators <%s>" % subject)
mailMsg['From'] = ("Python管理员 <%s>" % self.fromUser)
mailMsg['To'] = ','.join(toAddrs)
# 邮件正文是MIMEText :
mailMsg.attach(MIMEText('<html><body><h1>%s</h1>' % (msg) + '<p><img src="cid:1"></p>' + '</body></html>', 'html','utf-8'))
#mailMsg.attach(MIMEText(msg, 'html', 'utf-8')) # 发送文件附件, 需要用到附件对象MIMEBase对象, 需要引入from email.mime.multipart import MIMEBase
# 添加附件就是加上一个MIMEBase,从本地读取一个文件:
with open(filePath, "rb") as f:
#with open(r"C:\Users\YJ\Desktop\aaa.txt", "rb") as f:
# 设置附件的MIME和文件名,这里是png类型:
mime = MIMEBase("txta", "txt", filename="info.txt")
# 加上必要的头信息:
mime.add_header('Content-Disposition', 'attachment', filename='info.txt')
mime.add_header('Content-ID', '<0>')
mime.add_header('X-Attachment-Id', '')
# 把附件的内容读进来:
mime.set_payload(f.read())
# 用Base64编码:
encoders.encode_base64(mime)
# 添加到MIMEMultipart:
mailMsg.attach(mime)
return mailMsg.as_string()
# 发送邮件
def sendMail(self, toAddrs, subject, msg,filePath):
mailMsg_as_string = self.mailStructure(toAddrs, subject, msg,filePath)
# 连接服务器发送邮件
try:
server = smtplib.SMTP_SSL(self.smtpAddr, 465)
server.connect(self.smtpAddr) # 连接smtp服务器
server.login(self.fromUser, self.userPasswd) # 登录邮箱
server.sendmail(self.fromUser, toAddrs, mailMsg_as_string) # 发送邮件
server.quit()
except Exception:
print("Error: unable to send email") subject = sys.argv[1] # 邮件主题
msg = sys.argv[2] # 邮件内容
filePath = sys.argv[3] # 附件路径
a = SendMail() #实例化一个对象
a.sendMail(["381347268@qq.com",], subject, msg, filePath) #执行sendMail方法

(2)编写shell监控脚本/tmp/test.sh

#!/bin/bash
#date:
#explain:监控目录是否发生变化
#by:YJLI CHECKDIR="/tmp/test" #监控目录路径
LOG="/tmp/inot.log" #日志存放路径
PYTHONMAIL="/tmp/mail.py" #发送邮件脚本路径 function CheckDir {
inotifywait -mrq --timefmt '%y-%m-%d %H:%M' --format '%T %f %e' -e 'create,delete,modify,moved_to' $CHECKDIR|while read event
do
INO_TIME=$(echo $event | awk '{print $1,$2}') # 把inotify输出切割 把时间部分赋值给INO_TIME
INO_FILE=$(echo $event | awk '{print $3}') # 把inotify输出切割 把文件路径部分赋值给INO_FILE
INO_EVENT=$(echo $event | awk '{print $4}') # 把inotify输出切割 把事件类型部分赋值给INO_EVENT if [[ $INO_EVENT = 'CREATE' ]] && [[ $INO_FILE != .* ]];then # 判断事件类型(create)
echo "`date '+%Y-%m-%d %H:%M'` create file: $INO_FILE" >> $LOG
/usr/bin/python3. $PYTHONMAIL create "创建了一个文件:${INO_FILE},详情见附件" $LOG
elif [[ $INO_EVENT = 'CREATE,ISDIR' ]];then
echo "`date '+%Y-%m-%d %H:%M'` create dir: $INO_FILE" >> $LOG
/usr/bin/python3. $PYTHONMAIL create "创建了一个目录:${INO_FILE},详情见附件" $LOG
fi if [[ $INO_EVENT = 'DELETE' ]] && [[ $INO_FILE != .* ]];then # 判断事件类型(delete)
echo "`date '+%Y-%m-%d %H:%M'` delete file: $INO_FILE" >> $LOG
/usr/bin/python3. $PYTHONMAIL delete "删除了一个文件:${INO_FILE},详情见附件" $LOG
elif [[ $INO_EVENT = 'DELETE,ISDIR' ]];then
echo "`date '+%Y-%m-%d %H:%M'` delete dir: $INO_FILE" >> $LOG
/usr/bin/python3. $PYTHONMAIL delete "删除了一个目录:${INO_FILE},详情见附件" $LOG
fi if [[ $INO_EVENT = 'MODIFY' ]] && [[ $INO_FILE != .* ]];then # 判断事件类型(modify)
echo "`date '+%Y-%m-%d %H:%M'` modify file: $INO_FILE" >> $LOG
/usr/bin/python3. $PYTHONMAIL delete "修改了一个文件:${INO_FILE},详情见附件" $LOG
fi done
} CheckDir

(3)执行shell脚本并放在后台执行

[root@courtoap tmp]# nohup bash /tmp/test.sh &  #执行脚本并放在后台执行

(4)测试

[root@courtoap test]# cd /tmp/test  #进入到测试目录
[root@courtoap test]# ls  #查看当前目录文件
[root@courtoap test]# touch file1  #创建一个新的文件
[root@courtoap test]# mkdir dir1  #创建一个新的目录
[root@courtoap test]# echo test >> file1   #编辑file1文件
[root@courtoap test]# rm -rf file1   #删除file1文件
[root@courtoap test]# touch dir1/dir1_file  #在dir1目录里面再创建一个文件
[root@courtoap test]# cat /tmp/inot.log  #查看生成的日志
2019-02-13 16:00 create file: file1
2019-02-13 16:00 create dir: dir1
2019-02-13 16:00 modify file: file1
2019-02-13 16:01 delete file: file1
2019-02-13 16:03 create file: dir1_file

查看邮件:

Linux-监控目录及文件的更多相关文章

  1. Python监控目录和文件变化

    一.os.listdir import os, time path_to_watch = "." before = dict ([(f, None) for f in os.lis ...

  2. linux常用目录和文件解析

    1. 一级目录 /dev 设备目录 /etc 系统配置及服务配置文件.启动命令的目录 /proc 显示内核及进程信息的虚拟文件系统 /tmp 临时文件目录 /home 普通用户家目录 /root 超级 ...

  3. Linux 之 目录和文件

    1  初识 1.1  终端 打开终端: Ctrl + Alt + F1 ~ F6 图形界面: Ctrl + Alt + F7 1.2  命令 1)  一般 date; cal - calendar; ...

  4. linux获得目录下文件个数

    获得当前目录下文件个数赋值给变量panonum: panonum=$(ls -l |grep "^-" | wc -l) 获取指定目录下文件个数赋值给指定变量: panonum=$ ...

  5. shell脚本监控目录下文件被篡改时报警

    思路: 目录下文件被篡改的几种可能: 1.被修改 2.被删除 3.新增文件 md5命令详解 参数: -b 以二进制模式读入文件内容 -t 以文本模式读入文件内容 -c 根据已生成的md5值,对现存文件 ...

  6. linux 查找目录或文件详解

    查找目录:find /(查找范围) -name '查找关键字' -type d查找文件:find /(查找范围) -name 查找关键字 -print 如果需要更进一步的了解,可以参看Linux的命令 ...

  7. 利用shell脚本监控目录内文件改动

    #! /bin/bash webroot="/home/www/" cp /dev/null rsync_file if [ ! -f   file.md5 ];then      ...

  8. C# 利用FTP自动下载xml文件后利用 FileSystemWatcher 监控目录下文件变化并自动更新数据库

    using FtpLib; using System; using System.Collections.Generic; using System.ComponentModel; using Sys ...

  9. linux 查找目录或文件

    查找目录:find /(查找范围) -name '查找关键字' -type d查找文件:find /(查找范围) -name 查找关键字 ·find path -option [ -print ] [ ...

  10. linux获取目录下文件

    查看当前目录下的文件: find . -type f 查看当前目录下的文件夹: find . -type d 如果文件file1不为空: if [ -s file1 ];then      echo  ...

随机推荐

  1. AOP中使用Aspectj对接口访问权限进行访问控制

    切面编程的应用案例比较多,在统一的日志处理,鉴权过程中都会用的AOP原理,本文主要针对对进口的访问权限进行控制为例,说明 切面编程的使用: 1.使用Aspectj的方式进行切面编程: 2.编码环境,s ...

  2. 浅谈SPA

    最近一直在学习关于Vue的一些知识,由于遇到了问题,去网上查找资料,收获颇丰,在此分享. 1. 什么是SPA? 单页Web应用(single page web application, SPA),就是 ...

  3. Python第十天 print >> f,和fd.write()的区别 stdout的buffer 标准输入 标准输出 从控制台重定向到文件 标准错误 重定向 输出流和输入流 捕获sys.exit()调用 optparse argparse

    Python第十天   print >> f,和fd.write()的区别    stdout的buffer  标准输入 标准输出  从控制台重定向到文件  标准错误   重定向 输出流和 ...

  4. BCP SQL导出EXCEL常见问题及解决方法;数据导出存储过程

    一.‘xp_cmdshell’的启用 SQL Server阻止了对组件‘xp_cmdshell’的过程‘sys.xp_cmdshell’的访问.因为此组件已作为此服务嚣安全配置的一部分而被关 闭.系统 ...

  5. SQLServer之创建索引视图

    索引视图创建注意事项 对视图创建的第一个索引必须是唯一聚集索引. 创建唯一聚集索引后,可以创建更多非聚集索引. 为视图创建唯一聚集索引可以提高查询性能,因为视图在数据库中的存储方式与具有聚集索引的表的 ...

  6. Docker之进入容器(三)

    1.简介 经过前面两篇博客的扫盲,大家多多少少对docker有了一个基本的了解,也接触了docker的常用命令.在这篇博客中,我将介绍进入docker容器的几种方式. 2.进入docker中的几种方式 ...

  7. 我的第一个python web开发框架(32)——定制ORM(八)

    写到这里,基本的ORM功能就完成了,不知大家有没有发现,这个ORM每个方法都是在with中执行的,也就是说每个方法都是一个完整的事务,当它执行完成以后也会将事务提交,那么如果我们想要进行一个复杂的事务 ...

  8. hmac_检验客户端是否合法

    老师博客:http://www.cnblogs.com/Eva-J/articles/8244551.html#_label6 server端 import socket import os impo ...

  9. Linux下的快速配置虚拟环境virtualenvwrapper

    一 安装包 pip3 install virtualenv virtualenvwrapper 二 设置linux的用户个人配置文件~/.bashrc WORKON_HOME=~/Envs 设置vir ...

  10. menu

    <template> <el-row :gutter="10"> <div> <el-row :gutter="10" ...