![跟踪每日目录更改(并通过电子邮件发送)](https://linux22.com/image/19231/%E8%B7%9F%E8%B8%AA%E6%AF%8F%E6%97%A5%E7%9B%AE%E5%BD%95%E6%9B%B4%E6%94%B9%EF%BC%88%E5%B9%B6%E9%80%9A%E8%BF%87%E7%94%B5%E5%AD%90%E9%82%AE%E4%BB%B6%E5%8F%91%E9%80%81%EF%BC%89.png)
我有一个 Debian 支持的 NAS 服务器 (ReadyNAS),具有很深的文件层次结构。我希望每天收到有关其某些目录及其子目录中发生的更改的通知。
因此,如果有人在白天不小心删除了文件,我会在晚上收到电子邮件通知(其中包含所有更改的摘要),并在第二天早上从备份中恢复文件。
起初我想编写一个 PHP CL 或 Python 脚本来递归扫描目录,但后来我想也许有一些简洁的 unix 工具可以做得更好。类似 dirmp 的东西:)
你会怎么做?
谢谢
答案1
跑步绊线作为夜间工作。
或者,将整个系统置于版本控制之下。运行版本控制工具的diff
命令以查看更改及其恢复命令(无论其名称如何)以恢复本地副本中的任何更改。请注意,大多数版本控制系统处理文件内容,但需要对元数据(例如权限)进行额外的工作。
或者,使用具有某种形式的快照支持的存储系统,例如 LVM 或虚拟机。
或者,为什么不首先使用阻止所有更改呢?
答案2
您可以编写一个执行类似操作的脚本(未经测试,抱歉)并将其放入 crontab 中:
#!/bin/bash
# whom to mail
mailto="[email protected]"
# what directory to look in
dir="/somewhere/else"
# make the directory safer to embed in filenames
dirname=$(echo $dir | tr "/" "-" | tail -c +2)
# today's date, add hours & minutes if you want to run it more often
today=$(date +"%Y%m%d")
# yesterday's date
yesterday=$(date -d -1day +"%Y%m%d")
# filenames
todayfile=$dirname-$today.files.bz2
yesterdayfile=$dirname-$yesterday.files.bz2
# the business. Use find -printf if you want to capture additional metadata.
find $dir |sort |bzip2 > $todayfile
if [ -r $yesterdayfile ]; then
bzdiff $yesterdayfile $todayfile | mail $mailto -s "Directory differences for $dir from $yesterday to $today"
else
echo "No file listing from $yesterday, can't produce report | mail $mailto -s "Unable to report directory differences for $dir, no report from $yesterday"
fi
或者你可以只是使用我的产品这使得这种事情变得非常容易。 :)
【已经没有这样的产品了,抱歉】
答案3
使用 BTRFS,您可以安装实时快照文件系统,其中“存储”所有更改的文件。