8

问题是,我想跟踪用户是否尝试在共享帐户上打开文件。我正在寻找任何可以帮助我了解相关文件是否在运行时打开的记录/技术。

我想创建一个脚本来监视文件是否打开,如果是,我希望它向特定的电子邮件地址发送警报。我正在考虑的文件是一个常规文件。

我尝试使用lsof | grep filename用于检查文件是否在 gedit 中打开,但该命令不返回任何内容。

实际上,我正在为一个宠物项目尝试这个,因此是这个问题。

4

4 回答 4

8

该命令lsof -t filename显示打开了特定文件的所有进程的 ID。lsof -t filename | wc -w为您提供当前访问该文件的进程数。

于 2017-07-19T19:22:55.237 回答
6

文件已被读入 gedit 之类的编辑器这一事实并不意味着该文件仍处于打开状态。编辑器很可能会打开文件,读取其内容,然后关闭文件。编辑文件后,您可以选择覆盖现有文件或另存为另一个文件。

于 2015-06-19T10:24:37.230 回答
2

您可以(除了其他答案)使用特定于 Linux 的inotify(7)工具。

我了解您希望使用固定的文件路径(实际上是给定的 i 节点)跟踪一个(或几个)特定的给定文件。例如,您希望跟踪何时/var/run/foobar访问或修改,并在发生这种情况时执行某些操作

特别是,您可能想要安装和使用incrond(8)并通过incrontab(5) 对其进行配置

如果您想在访问或修改某些给定文件(在本地本地,例如 Ext4、BTRS,... 但不是 NFS 文件系统)时运行脚本,则使用inotify正是为此目的。 incrond

PS。AFAIK,inotify不适用于远程网络文件,例如 NFS 文件系统(特别是当另一台 NFS 客户端计算机正在修改文件时)。

如果您喜欢的文件是某种源文件,您可能会对修订控制系统(如git)或构建器系统(如GNU make)感兴趣;在某种程度上,这些工具与文件修改有关。

您还可以让特定文件系统位于某个FUSE文件系统中,并编写您自己的FUSE守护进程。

如果您可以限制和修改访问文件的程序,您可能需要使用建议锁定,例如flock(2)lockf(3)

也许文件中的数据应该在某个数据库中(例如sqlite或像PostGreSQLMongoDB这样的真实 DBMS )。性质很重要....

请注意,文件系统挂载选项可能很重要。

您可能想要使用stat(1)命令。

如果不了解实际用例和动机,就很难提供更多帮助。你应该避免一些XY 问题

可能,工作流程是错误的(在能够编写它的多个用户之间有一个共享文件),您应该以其他方式处理整个问题。对于一个宠物项目,我至少建议使用一些咨询锁,并通过您自己的程序(可能是setuid)访问和修改信息flock(这不包括普通编辑器gedit或类似cat...的命令)。但是,您的隐式用例似乎非常适合 DBMS 方法(数据库不必包含大量数据,它可能很小),或者像GDBM 库这样的索引锁定文件正在处理。

请记住,在 POSIX 系统和 Linux 上,多个进程可以同时访问(甚至修改)同一个文件(除非您使用一些锁定或同步)。

阅读Advanced Linux Programming这本书(免费提供)会给你一个更广阔的视野(但它没有提到inotify是在这本书写完之后出现的)。

于 2015-06-19T13:14:47.503 回答
0

您可以使用ls -lrt,它显示 shell 中最后的 RW 操作。然后你可以断定文件是否被打开。确保您位于确切的目录中。

于 2015-06-19T10:18:42.957 回答