【发布时间】:2011-02-15 07:24:51
【问题描述】:
我想在文件在系统中移动时对其进行监控。 iNotify 可以在移动时告诉我它的新位置吗?
【问题讨论】:
我想在文件在系统中移动时对其进行监控。 iNotify 可以在移动时告诉我它的新位置吗?
【问题讨论】:
如果您同时查看文件从中移动的目录和文件移动到的目录,那么您将在源目录上收到 IN_MOVED_FROM 事件,在目标目录上收到 IN_MOVED_TO 事件,两者都具有相同的cookie。然后,您可以使用这两个事件的 name 字段来找出文件移入和移出的位置。
如果你只看源目录,或者只看目标目录,那么你只会得到其中一个事件,所以你只会得到一半的信息。这是 inotify 的一个限制。
【讨论】:
您可以在移动之前获取文件的文件描述符并在以下位置读取符号链接:
'/proc/self/fd/' + $fd
$fd 是你的文件描述符,这个文件描述符将指向你的文件。注意我只在 ext4 上测试过,它适用于 LVM2,但不适用于 OverlayFS。打开文件描述符也会阻止为文件触发删除事件。
linux内核版本之间也可能存在问题
【讨论】:
'/proc/self/fd/' + $fd 大多数编程语言有办法打开文件。当文件被进程打开时,它会创建一个文件描述符,该描述符通常由操作系统发出的唯一编号表示;那就是有问题的 $fd 变量。
根据@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_MOVE(DONT_MOVE 或您为要监控的每个文件/文件夹单独选择的任何其他标签)
【讨论】: