最近我遇到了一个意外事件,一些文件被意外删除。这些文件位于共享网络托管帐户 (FreeBSD) 上,但目录树很深。
我倾向于用 PHP 或 Python 自己编写一些可以实现以下功能的东西:
- 扫描每个目录,查看每个目录中包含的文件数量
- 存储该数据,可能在 MySQL 数据库中
- 每天运行一份报告,告诉我哪里有活动(因此,我会看到上传目录中有 3 个新文件,或者缩略图目录中的文件减少了 10 个,甚至每个文件都告诉我它已更改(也许它获取每个文件的哈希值并存储它?)。
- 运行每日 cron 任务,并根据前一天所做的更改执行任务(或每周 cron 任务,并根据前一周所做的更改执行任务,或以其他合理的间隔执行任务)
但我感觉在我之前有人做过这样的事。这是否真的存在,而我只是不知道?
答案1
如果你只关心文件的添加或删除,你可以结合使用 find 和 diff 来监视更改:-
find /some/dir -print > file-list.expected # baseline
# Add/remove files
find /some/dir -print > file-list.current
diff file-list.expected file-list.current # look for changes
mv file-list.old file-list.new # update baseline (optional)
但是,如果您需要(或想要)知道文件的内容是否也发生了变化,FreeBSD 附带了一个名为 [mtree][1] 的实用程序,可用于报告目录层次结构与预期基线之间发现的任何变化:-
mtree -c -i -n -K cksum -p /some/dir > baseline.mtree # baseline
# Add/remove/change files
mtree -f baseline.mtree -p /some/dir # look for changes
mtree -c -i -n -K cksum -p /some/dir > baseline.mtree # update baseline (optional)
对于任何一种方法,明智的做法是使您的基线文件不可变(“chflags uchg baseline.file”),这有助于防止除 root 之外的任何人(包括您自己)意外删除您的文件。