首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Linux用户空间检测修改文件

问从Linux用户空间检测修改文件
EN

Stack Overflow用户
提问于 2011-11-09 16:54:27
回答 3查看 571关注 0票数 0

我需要在Linux系统上生成自上一次列表生成以来修改过的文件列表。我需要在用户空间上这样做,所以像法姆这样的解决方案不适合我。要做到这一点,我有以下一些限制:

  1. 目标解决方案可用于ext2和ext3文件系统。
  2. 必须在用户空间上实现,不允许内核修改或模块。
  3. 不能依赖于文件修改时间。它应该至少使用文件大小,或者更好地使用校验和算法来生成德尔塔。
  4. 不必是实时的,它将定期运行(例如。每10分钟一次)

有人知道这个任务已经实现的解决方案了吗?为此,我尝试使用rsync,但rsync似乎需要所有文件的副本来计算差异。

编辑

基本上,我需要一种机制,在给定的目录下递归地对文件列表及其增量进行分类,并与前面的目录进行比较。它可以使用文件大小来生成差异,或者更好地使用差分算法(类似于rsync算法)。但是,像MD5和SHA1这样的密码散列算法并不适合我,因为它们的性能不同。请不要说我有成千上万的文件,这不是加密的情况。

实时解决方案或需要在内核上进行更改的解决方案(如inotify、kqueue、法姆、保险丝)也不适合我。

谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-11-09 17:02:48

  • 您可以使用inotify工具来监视文件系统。不确定是否已经有这样的工具,但是快速搜索提供了很多结果,例如https://github.com/rvoicilas/inotify-tools/wiki/。
  • 您可以使用md5sum来完成以下操作: find / -xdev -type f -print0 | xargs -0 md5sum -b >> /tmp/sums.txt 现在,您可以对这些文件进行排序并进行比较,以检测差异: sort -k 2 < /tmp/sums.txt > /tmp/sums.sorted.txt 我认为您理解这个想法,但是当然这需要大量的时间,因为您正在检查所有的数据。

编辑:我已经编写了一个快速脚本来转储文件系统树,并将文件大小附加到文件名中。您可以使用diff对两次运行的输出进行比较,以确定已更改的内容。当然,这只是一个剪刀,可以改进。

代码语言:javascript
复制
#!/usr/bin/env python

import os
import sys

# initialize variables.
entries=[]
if len(sys.argv) > 1:
        rootdir=os.path.normpath(sys.argv[1])
else:
        rootdir=os.curdir

# walk filesystem tree.
for root, dirs, files in os.walk(rootdir):
        for name in sorted(files):
                fullname=os.path.normpath(os.path.join(root, name))
                if os.path.islink(fullname) or not os.path.isfile(fullname):
                        entries.append(fullname)
                else:
                        st=os.stat(fullname)
                        entries.append("%s %d" % (fullname, st.st_size))
        for name in sorted(dirs):
                entries.append(os.path.normpath(os.path.join(root, name)))

# print sorted list of found filesystem entries.
for entry in sorted(entries):
        print entry

这对你有帮助吗?

建议的改进:

  • 检查一个目录是否是一个挂载点,并将其排除在遍历之外。
  • 将前面的类型字母转储,例如f blub 6或d test,以查找已更改的文件类型。
  • 将st_mtime/st_atime/st_ctime附加到文件中,以便根据时间检测文件更改。
  • 附加文件的第一个和最后一个1024字节的md5和,以检测最常见的更改(f.e。如果文件被附加数据)。
  • 对文件的内容附加完整的校验和,例如CRC32。

我希望这些建议能帮助你创造一个很酷的工具;-)

票数 1
EN

Stack Overflow用户

发布于 2011-11-09 16:58:48

如果您对每次运行重新计算每个文件的校验和感到满意,可以使用以下简单解决方案:

代码语言:javascript
复制
 find / ( -not -path '/tmp/*' -and -type f ) -print0 | xargs -0 md5sum > /tmp/current-listing
 diff /tmp/old-listing /tmp/current-listing
 mv /tmp/current-listing /tmp/old-listing
票数 1
EN

Stack Overflow用户

发布于 2011-11-09 16:58:07

你可以看看

  • 绊线
  • rkhunter
  • rsync (但您必须有一个参考副本)

rdiffbackup和r快照是基于rsync的完整增量(分层)备份解决方案。

您也可能在zfs或zfsonlinux中有很多用途。这些文件系统支持连续的快照:

代码语言:javascript
复制
 SNAPID=$RANDOM # something unique, please
 zfs snapshot tank/volume_of_mount@$SNAPID
 zfs send -i tank/volume_or_mount@previous tank/volume_of_mount@$SNAPID |
     pbzip2 > dumpfile.$SNAPID.bz2

接收端:

代码语言:javascript
复制
 zfs receive -vFdn tank2/into_this@$SNAPID < dumpfile.$SNAPID.bz2

这种快照可以实时、实时地完成,并且执行得很好,因为ZFS是一个日志结构文件系统,具有内置的基于merkel树的完整性检查。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8068524

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档