工作中, 有时候我们需要知道某个文件是否被修改了, 被哪个程序修改了. Linux 下可以很方便地监控某个文件被修改的记录. 根据目的不同, Linux 下有不同的监视文件或文件夹的方案.

A. Auditd

Auditd 可以很方便监控记录哪些程序和用户对指定文件 (即使不存在) 做的操作.

安装 auditd一般发行版软件仓库里都会有 auditd 安装包. 如果默认没有安装, 可以很方便地利用包管理器来安装## Fedora

$ sudo dnf install -y audit

## CentOS

$ sudo yum install -y audit

## Debian / Ubuntu

$ sudo apt install -y audit启动 audit 服务$ sudo systemctl enable --now auditd检查 audit 服务状态$ sudo systemctl status auditd

● auditd.service - Security Auditing Service

Loaded: loaded (/usr/lib/systemd/system/auditd.service; enabled; vendor preset: enabled)

Active: active (running) since Fri 2018-09-07 08:47:53 CST; 10min ago

Docs: man:auditd(8)

https://github.com/linux-audit/audit-documentation

Process: 28126 ExecStartPost=/sbin/augenrules --load (code=exited, status=0/SUCCESS)

Process: 28121 ExecStart=/sbin/auditd (code=exited, status=0/SUCCESS)

Main PID: 28122 (auditd)

Tasks: 5 (limit: 4915)

Memory: 3.3M

CGroup: /system.slice/auditd.service

├─28122 /sbin/auditd

├─28124 /sbin/audispd

└─28127 /usr/sbin/sedispatch

这就表示服务正常.

配置 audit 监视规则为了监视文件的访问操作, 需要在/etc/audit/rules.d/audit.rules 添加如下规则, 其中 perm 是要监控的操作, key 是在查寻时指定的关键字, path 是要监控的文件路径.$ vi /etc/audit/rules.d/audit.rules

-a always,exit -F path=/path/to/file -F perm=warx -F key=keyword-for-filter-log重启 audit 服务### Note: use service instead of systemctl

$ sudo service auditd restart检查 audit 规则.$ sudo auditctl -l

-a always,exit -F path=/path/to/file -F perm=warx -F key=keyword-for-filter-log

检查文件操作记录

假如我们监控 /root/test.txt 的操作, 规则是-a always,exit -F path=/root/test.txt -F perm=warx -F key=test-filter

然后对其做一些操作$ ls /root/test.txt

$ cat /root/test.txt

$ touch /root/test.txt

然后通过如下命令查询操作记录.$ ausearch -k test-filter

time->Fri Sep 7 09:23:24 2018

type=PROCTITLE msg=audit(1536283404.017:39844): proctitle=63617400746573742E747874

type=PATH msg=audit(1536283404.017:39844): item=0 name="test.txt" inode=1587579 dev=103:08 mode=0100644 ouid=0 ogid=0 rdev=00:00 nametype=NORMAL cap_fp=0000000000000000 cap_fi=0000000000000000 cap_fe=0 cap_fver=0

type=CWD msg=audit(1536283404.017:39844): cwd="/root"

type=SYSCALL msg=audit(1536283404.017:39844): arch=c000003e syscall=257 success=yes exit=3 a0=ffffff9c a1=7fff145999ed a2=0 a3=0 items=1 ppid=32477 pid=10767 auid=1000 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts4 ses=3 comm="cat" exe="/usr/bin/cat" key="test-filter"

----

time->Fri Sep 7 09:27:22 2018

type=PROCTITLE msg=audit(1536283642.307:40008): proctitle=6C73002D2D636F6C6F723D6175746F

type=PATH msg=audit(1536283642.307:40008): item=0 name="test.txt" inode=1587579 dev=103:08 mode=0100644 ouid=0 ogid=0 rdev=00:00 nametype=NORMAL cap_fp=0000000000000000 cap_fi=0000000000000000 cap_fe=0 cap_fver=0

type=CWD msg=audit(1536283642.307:40008): cwd="/root"

type=SYSCALL msg=audit(1536283642.307:40008): arch=c000003e syscall=191 success=no exit=-61 a0=7ffcd0a58c40 a1=7f4b30ece210 a2=7ffcd0a58c00 a3=14 items=1 ppid=1617 pid=12314 auid=1000 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts6 ses=3 comm="ls" exe="/usr/bin/ls" key="test-filter"

----

time->Fri Sep 7 09:27:29 2018

type=PROCTITLE msg=audit(1536283649.775:40009): proctitle=746F75636800746573742E747874

type=PATH msg=audit(1536283649.775:40009): item=1 name="test.txt" inode=1587579 dev=103:08 mode=0100644 ouid=0 ogid=0 rdev=00:00 nametype=NORMAL cap_fp=0000000000000000 cap_fi=0000000000000000 cap_fe=0 cap_fver=0

type=PATH msg=audit(1536283649.775:40009): item=0 name="/root" inode=1569793 dev=103:08 mode=040550 ouid=0 ogid=0 rdev=00:00 nametype=PARENT cap_fp=0000000000000000 cap_fi=0000000000000000 cap_fe=0 cap_fver=0

type=CWD msg=audit(1536283649.775:40009): cwd="/root"

type=SYSCALL msg=audit(1536283649.775:40009): arch=c000003e syscall=257 success=yes exit=3 a0=ffffff9c a1=7fff075909e1 a2=941 a3=1b6 items=2 ppid=1617 pid=12367 auid=1000 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts6 ses=3 comm="touch" exe="/usr/bin/touch" key="test-filter"

我们可以看到都有 cat, ls, touch 在相应的时间对其做了什么操作. aureport 可以给出更直观的报告,$ ausearch -k test_filter | aureport -f -i

33. 09/07/2018 09:56:23 test.txt getxattr no /usr/bin/ls amito 41596

34. 09/07/2018 09:56:26 test.txt openat yes /usr/bin/cat amito 41600

35. 09/07/2018 09:56:28 test.txt openat yes /usr/bin/touch amito 41607

Systemtap

systemtap 功能非常强大, 可以监控系统调用, 也可检测文件的修改操作. 但是需要安装系统的 debug 模块. 可能需要在相应的 repo 中 设置 debug 为enabled=1

安装 Systemtap## Fedora

$ sudo dnf install -y kernel-debuginfo kernel-debuginfo-common systemtap systemtap-client systemtap-runtime systemtap-devel

## CentOS

$ sudo yum install -y kernel-debuginfo kernel-debuginfo-common systemtap systemtap-client systemtap-runtime systemtap-devel

获取文件信息$ stat -c '%D %i' test.txt

10308 1587579

Systemtap 监控脚本

下面这个脚本可以监控文件的修改记录. 将脚本保存为 inodewatch.stp#! /usr/bin/env stap

probe vfs.write, vfs.read

{

# dev and ino are defined by vfs.write and vfs.read

if (dev == MKDEV($1,$2) # major/minor device

&& ino == $3)

printf ("%s(%d) %s 0x%x/%un",

execname(), pid(), ppfunc(), dev, ino)

}

监控文件$ sudo stap sudo stap inodewatch.stp 0x103 0x08 1587579

其中连个十六进制数字 0x103 0x08 是上面得到的文件设备 ID 10308. 现在对 test.txt 做一些操作.vim test.txt

cat test.txt

脚本会给出如下类似的信息vim(22230) vfs_read 0x10300008/1587579

vim(22230) vfs_read 0x10300008/1587579

vim(22230) vfs_read 0x10300008/1587579

vim(22230) vfs_read 0x10300008/1587579

vim(22230) vfs_read 0x10300008/1587579

vim(22230) vfs_write 0x10300008/1587579

cat(22303) vfs_read 0x10300008/1587579

cat(22303) vfs_read 0x10300008/1587579

我们可以看到 vim, cat 对 test.txt 做了一些读写操作.

inotifywait

inotifywait 是 inotify-tools 里带的工具可以监控文件的修改建立等等.

安装 inotify-tools$ sudo dnf install -y inotify-tools

# or

$ sudo apt install -y inotify-tools

监控 文件夹下的文件产生, 修改, 删除$ inotifywait -m /path/to/watch -r -e create -e moved_to -e delete -e modify | while read path action file; do

$...

$your action here

$...

$ done

比如, 在特定文件 test.txt 产生时, 给特定邮箱发邮件, 并删除它$ inotifywait -m /path -e create -e moved_to | while read path action file; do

$ echo "The file'$file'appeared in directory'$path'via'$action'."

$ if [[$file == "test.txt"]]; then

$ echo "The file'$file'appeared in directory'$path'via'$action'. Deleting"|mutt -s "Deleting $file" your_email

$sudo rm -rf /path/test.txt

$ fi

$ done

Buy Me A Coffee?

linux监控文件变化的程序,在 Linux 下监控程序修改文件相关推荐

  1. win7如何设置全程监控电脑运行的程序 win7全程如何监控你电脑方法

    win7如何设置全程监控电脑运行的程序 win7全程如何监控你电脑方法 我们在使用电脑的时候,总是会遇到很多的电脑难题.当我们需要在win7系统中进行监控的时候,应该怎么设置呢?今天我们就可以一起来跟 ...

  2. php 删除文件夹及文件夹,php删除一个路径下的所有文件夹和文件的方法

    php遍历一个文件夹内的所有文件和文件夹,并删除所有文件夹和子文件夹下的所有文件的代码,通过递归方式实现达到清空一个目录的效果,代码简单实用. 也适合在thinkphp中清理缓存,在thinkphp中 ...

  3. 复制当前目录所有文件夹及其子文件夹下的*.jpg文件到store文件夹下

    1.复制当前目录所有文件夹及其子文件夹下的.jpg文件到store文件夹下 2.不论多少层目录结构都可以 3.更改文件后缀名.jpg为其它后缀名的文件同样适用 #!/bin/bash # yikai ...

  4. linux 命令美丽,美丽的程序猿-Linux下那些查找文件的小技巧-find

    原标题:美丽的程序猿-Linux下那些查找文件的小技巧-find 一.按照文件名匹配查找 1. 查找当前目录下的文件tmp.sh find . –name tmp.sh 可以看出,使用.查找是查找当前 ...

  5. linux执行可执行命令程序ls,linux运行可执行程序命令

    linux 命令行如何运行程序 我用的是Ubuntu,安装了一个分子模拟软件,但是不知道如何运行程序,比cd到目录下,然后ls -l tleap,如果有x权限,直接./tleap,如果没有x,就先执行 ...

  6. linux java后台运行_Java程序在Linux中实现后台运行

    1.运行脚本 脚本如下,这个脚本存在一点问题,Log4j稍微有点问题,但是对运行及日志记录没有影响,日志是通过将所有控制台数据全部写入文件的形式记录的. #!/bin/sh #author:wangc ...

  7. linux删除文件_【Linux实战】Vim编辑器和恢复ext4下误删除的文件

    学神IT教育:XueGod-IT 良心教育 贴心服务 1.  vim主要模式介绍,vim命令模式. 确保系统已经安装了VIM工具 [root@panda ~]# rpm -qf `which vim` ...

  8. Linux怎么让文件按大小排序,linuxsortlinux系统下,按文件的大小进行排序的命令...

    怎样用sort 命令以 GPA作为关键字排序文件 Linux可以使用ls命令实现这一功能. ls命令是一个非常有用的查看文件与目录的命令,list之意,它的参数非常多. ls命令默认是按照文件名的字母 ...

  9. 【文件IO】Linux 文件操作(一) —— 遍历指定目录下的所有文件

    目录 一.访问目录相关函数 1.打开/访问目录 (opendir / fdopendir) 2.读取目录内容 (readdir) 3.关闭目录 (closedir) 二.遍历指定目录下的所有文件 一. ...

  10. python监控目录变化_如何用python语言监控文件或目录变化

    本文python语言实例实现的功能是监控一个文件或目录的变化,如果有变化,把文件上传备份至备份主机,并且要监控上传过程是否有问题等,具体内容如下,希望对大家学习python语言有所帮助.#!/usr/ ...

最新文章

  1. 对 WEB 标准以及 W3C 的理解与认识?
  2. C语言 标识符的作用域
  3. C++程序设计之使用istringstream
  4. mysql经典面试题
  5. SQL SERVER的锁机制(四)——概述(各种事务隔离级别发生的影响)
  6. IOS开发基础之图片轮播器-12
  7. Java中的Enum(枚举)用法介绍
  8. java 判断请求为 ajax请求_请问如何判断一个请求是不是ajax请求?
  9. django-反向解析-命名分组路由的反解
  10. ios 优化html表单提交,iOS 使用AFNetworking的form表单请求
  11. Graph Structure of Neural Networks何凯明团队
  12. mysql一次更新内容大于4M时报错修改max_allowed_packet变量
  13. 2.5.5.2 特殊文件:/dev/null 与 /dev/tty
  14. Oracle oradebug 命令 使用说明
  15. catalan数的应用
  16. 强化学习之DQN(附莫烦代码)
  17. 爱奇艺内容中台数据中心的设计与实现
  18. Microsoft 365 E5 开发者扩容到5T
  19. Oracle-SQL语句的逻辑读怎么计算
  20. 17.Future 介绍与主要用法

热门文章

  1. Java 邮政EMS快递面打印实现 笔记
  2. Unity通过压缩字体减小包体大小
  3. ARM 汇编基础教程系列
  4. c语言图书馆管理系统(功能非常之多)
  5. oracle 虚拟机安装mac os,oracle vm virtualbox虚拟机安装mac os x详细图解
  6. 河南省谷歌高清卫星地图下载
  7. 武当功夫在现代2 视频
  8. 游戏王ygocore项目解析
  9. 数控g71编程实例带图_数控车G71,G70指令的编程加工实例
  10. ElasticJob分布式调度,使用注册中心zookeeper开启动态定时任务附源码(三)