linux监控文件变化的程序,在 Linux 下监控程序修改文件
工作中, 有时候我们需要知道某个文件是否被修改了, 被哪个程序修改了. 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 下监控程序修改文件相关推荐
- win7如何设置全程监控电脑运行的程序 win7全程如何监控你电脑方法
win7如何设置全程监控电脑运行的程序 win7全程如何监控你电脑方法 我们在使用电脑的时候,总是会遇到很多的电脑难题.当我们需要在win7系统中进行监控的时候,应该怎么设置呢?今天我们就可以一起来跟 ...
- php 删除文件夹及文件夹,php删除一个路径下的所有文件夹和文件的方法
php遍历一个文件夹内的所有文件和文件夹,并删除所有文件夹和子文件夹下的所有文件的代码,通过递归方式实现达到清空一个目录的效果,代码简单实用. 也适合在thinkphp中清理缓存,在thinkphp中 ...
- 复制当前目录所有文件夹及其子文件夹下的*.jpg文件到store文件夹下
1.复制当前目录所有文件夹及其子文件夹下的.jpg文件到store文件夹下 2.不论多少层目录结构都可以 3.更改文件后缀名.jpg为其它后缀名的文件同样适用 #!/bin/bash # yikai ...
- linux 命令美丽,美丽的程序猿-Linux下那些查找文件的小技巧-find
原标题:美丽的程序猿-Linux下那些查找文件的小技巧-find 一.按照文件名匹配查找 1. 查找当前目录下的文件tmp.sh find . –name tmp.sh 可以看出,使用.查找是查找当前 ...
- linux执行可执行命令程序ls,linux运行可执行程序命令
linux 命令行如何运行程序 我用的是Ubuntu,安装了一个分子模拟软件,但是不知道如何运行程序,比cd到目录下,然后ls -l tleap,如果有x权限,直接./tleap,如果没有x,就先执行 ...
- linux java后台运行_Java程序在Linux中实现后台运行
1.运行脚本 脚本如下,这个脚本存在一点问题,Log4j稍微有点问题,但是对运行及日志记录没有影响,日志是通过将所有控制台数据全部写入文件的形式记录的. #!/bin/sh #author:wangc ...
- linux删除文件_【Linux实战】Vim编辑器和恢复ext4下误删除的文件
学神IT教育:XueGod-IT 良心教育 贴心服务 1. vim主要模式介绍,vim命令模式. 确保系统已经安装了VIM工具 [root@panda ~]# rpm -qf `which vim` ...
- Linux怎么让文件按大小排序,linuxsortlinux系统下,按文件的大小进行排序的命令...
怎样用sort 命令以 GPA作为关键字排序文件 Linux可以使用ls命令实现这一功能. ls命令是一个非常有用的查看文件与目录的命令,list之意,它的参数非常多. ls命令默认是按照文件名的字母 ...
- 【文件IO】Linux 文件操作(一) —— 遍历指定目录下的所有文件
目录 一.访问目录相关函数 1.打开/访问目录 (opendir / fdopendir) 2.读取目录内容 (readdir) 3.关闭目录 (closedir) 二.遍历指定目录下的所有文件 一. ...
- python监控目录变化_如何用python语言监控文件或目录变化
本文python语言实例实现的功能是监控一个文件或目录的变化,如果有变化,把文件上传备份至备份主机,并且要监控上传过程是否有问题等,具体内容如下,希望对大家学习python语言有所帮助.#!/usr/ ...
最新文章
- 对 WEB 标准以及 W3C 的理解与认识?
- C语言 标识符的作用域
- C++程序设计之使用istringstream
- mysql经典面试题
- SQL SERVER的锁机制(四)——概述(各种事务隔离级别发生的影响)
- IOS开发基础之图片轮播器-12
- Java中的Enum(枚举)用法介绍
- java 判断请求为 ajax请求_请问如何判断一个请求是不是ajax请求?
- django-反向解析-命名分组路由的反解
- ios 优化html表单提交,iOS 使用AFNetworking的form表单请求
- Graph Structure of Neural Networks何凯明团队
- mysql一次更新内容大于4M时报错修改max_allowed_packet变量
- 2.5.5.2 特殊文件:/dev/null 与 /dev/tty
- Oracle oradebug 命令 使用说明
- catalan数的应用
- 强化学习之DQN(附莫烦代码)
- 爱奇艺内容中台数据中心的设计与实现
- Microsoft 365 E5 开发者扩容到5T
- Oracle-SQL语句的逻辑读怎么计算
- 17.Future 介绍与主要用法