iNotify 可以告诉我受监控文件的移动位置吗?

Posted

技术标签:

【中文标题】iNotify 可以告诉我受监控文件的移动位置吗?【英文标题】:Can iNotify tell me where a monitored file is moved? 【发布时间】:2011-02-15 07:24:51 【问题描述】:

我想在文件在系统中移动时对其进行监控。 iNotify 可以在移动时告诉我它的新位置吗?

【问题讨论】:

【参考方案1】:

如果您同时查看文件从中移动的目录和文件移动到的目录,那么您将在源目录上收到 IN_MOVED_FROM 事件,在目标目录上收到 IN_MOVED_TO 事件,两者都具有相同的cookie。然后,您可以使用这两个事件的 name 字段来找出文件移入和移出的位置。

如果你只看源目录,或者只看目标目录,那么你只会得到其中一个事件,所以你只会得到一半的信息。这是 inotify 的一个限制。

【讨论】:

用“IN_MOVE_SELF”监控文件怎么样?我不知道文件将被移动到哪里,所以我需要知道移动时的新文件路径。 不,就像我说的那样,除非您正在观看它移动到的目录,否则您不会获得有关移动目标的任何信息。【参考方案2】:

您可以在移动之前获取文件的文件描述符并在以下位置读取符号链接:

'/proc/self/fd/' + $fd

$fd 是你的文件描述符,这个文件描述符将指向你的文件。注意我只在 ext4 上测试过,它适用于 LVM2,但不适用于 OverlayFS。打开文件描述符也会阻止为文件触发删除事件。

linux内核版本之间也可能存在问题

【讨论】:

它如何使用不是很清楚。 背景:en.wikipedia.org/wiki/File_descriptor en.wikipedia.org/wiki/Open_(system_call) en.wikipedia.org/wiki/Symbolic_link 在移动操作之前创建文件句柄将允许您通过读取符号链接来跟踪它的新位置:'/proc/self/fd/' + $fd 大多数编程语言有办法打开文件。当文件被进程打开时,它会创建一个文件描述符,该描述符通常由操作系统发出的唯一编号表示;那就是有问题的 $fd 变量。 我使用了 auditctl 并且它有效(但需要 sudo)。【参考方案3】:

根据@slightly_toasted 的回答there,可以使用sudo auditctl -a always,exit -F arch=b64 -S rename,rmdir,unlink,unlinkat,renameat -F dir=/path/to/folder/to/monitor -F key=DONT_MOVE

DONT_MOVE 键/标签用于标识您将要监控的文件/文件夹。

您可以为要观看的不同文件/文件夹创建不同的标签。

为确保存储这些规则,请将相同的命令(auditctl 除外)-a always,exit -F arch=b64 -S rename,rmdir,unlink,unlinkat,renameat -F dir=/path/to/folder/to/monitor -F key=DONT_MOVE 附加到 /etc/audit/audit.rules 文件。

为此,您可以使用:sudo echo "-a always,exit -F arch=b64 -S rename,rmdir,unlink,unlinkat,renameat -F dir=/path/to/folder/to/monitor -F key=DONT_MOVE" >> /etc/audit/audit.rules(它表示权限被拒绝,因此需要修复)


那么

文件/文件夹丢失,您想知道它的新路径吗?使用ausearch -k DONT_MOVEDONT_MOVE 或您为要监控的每个文件/文件夹单独选择的任何其他标签)

【讨论】:

以上是关于iNotify 可以告诉我受监控文件的移动位置吗?的主要内容,如果未能解决你的问题,请参考以下文章

inotify事件监控工具

配置rsync+inotify实时同步

inotify事件监控

linux 实时同步inotify

inotify +rsync 实时同步

inotify 工具 是一种强大的细粒度的异步文件系统监控机制