Linux-監控目錄及文件

来源:https://www.cnblogs.com/yanjieli/archive/2019/02/13/10370503.html
-Advertisement-
Play Games

Linux-通過inotifywait監控目錄及文件 inotifywait命令的使用此處就不寫了;可以參考文章:https://www.cnblogs.com/martinzhang/p/4126907.html inotifywait命令是工具包 inotify-tools 裡面的,可以直接通過 ...


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:[email protected]

# 引入相應的模塊
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 收件人可以是多個,["[email protected]","[email protected]"], 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', '0')
            # 把附件的內容讀進來:
            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(["[email protected]",], subject, msg, filePath)    #執行sendMail方法

(2)編寫shell監控腳本/tmp/test.sh

#!/bin/bash
#date:20190213
#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.5 $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.5 $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.5 $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.5 $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.5 $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

 查看郵件:

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本文講解了 Python 的 property 特性,即一種符合 Python 哲學地設置 getter 和 setter 的方式。 ...
  • 一 Servlet的API的訪問 1 完全解耦和的方式 完全看不到request、response、session。 (1)創建jsp界面 (2)編寫action (3)struts_xml 運行效果圖 調用put方法相當於往request域中存數據註意:這種方式只能獲得像 request sess ...
  • asyncio之Coroutines,Tasks and Future Coroutines and Tasks屬於High-level APIs,也就是高級層的api。 本節概述用於協程和任務的高級非同步api。 Coroutines Coroutines翻譯過來意思是協程,使用async/awai ...
  • 1. eureka相關異常 1.1. 異常信息 1.2. 解決 1. 上述異常我在兩處地方遇到過,一是在集成txLCN分散式服務時,用到eureka註冊的時候,需要額外添加兩個配置類 否則也會報上述錯誤 2. 二是再junit的Test類中,用@SpringBootTest創建測試的時候,若是報上述 ...
  • 前邊我們提到了客戶端加域的操作方法,本章為大家補充域客戶端退域的操作過程,包含圖形化、netdom remove、Powershell三種方法,具體內容如下:圖形化退域方法:1.Win鍵,電腦右鍵屬性:2.系統界面在電腦名稱、域和工作組設置欄選擇"更改設置":3.在系統屬性界面,選擇"更改":4... ...
  • 解決windows憑據無法保存的問題1: 運行-gpedit.msc(組策略)-電腦配置-管理模板-系統-憑據分配 雙擊右側”允許分配保存的憑據用於僅NTLM伺服器身份驗證“ 在彈出的視窗中選中“已啟用“,單擊”顯示“,輸入鍵值”TERMSER/*“ 保存退出後,運行”gpupdate /forc ...
  • 目錄 1. 公鑰私鑰簡介 2. 使用密鑰進行ssh免密登錄 2.1. 實驗環境 2.2. 開始實驗 3. ssh的兩種登陸方式介紹 3.1. 口令驗證登錄 3.2. 密鑰驗證登錄 4. 總結 1、公私鑰簡介與原理 公鑰和私鑰都屬於非對稱加密演算法的一個實現,這個加密演算法的信息交換過程是: 1) 持有公 ...
  • Docker 常用命令 login/logout docker login [OPTIONS] [SERVER] 登錄到Docker鏡像倉庫,預設為Docker Hub。 docker logout [OPTIONS] [SERVER] 退出Docker鏡像倉庫。 OPTIONS 說明 u:登錄用戶 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...