Jac*_*ack 30 linux monitoring files
在 unix 中有什么方法可以找出谁在过去 1 周内访问了某个文件?它可能是用户或某些脚本 ftp 到其他地方。我可以获得访问某个文件的用户名列表吗?如何找出谁正在访问特定文件?
Gil*_*il' 45
除非您有非常不寻常的日志记录策略,否则谁访问了未记录的文件(那将是大量信息)。您可以在系统日志中查看谁在什么时间登录;该last命令为您提供登录历史记录和其他日志,例如/var/log/auth.log将告诉您用户如何进行身份验证以及他们从哪里登录(哪个终端,或者远程主机)。
上次读取文件的日期称为其访问时间,或简称为 atime。所有 unix 文件系统都可以存储它,但许多系统不记录它,因为它有(通常很小)性能损失。ls -ltu /path/to/file或stat /path/to/file显示文件的访问时间。
如果用户访问了该文件并且没有试图隐藏他的踪迹,他的 shell 历史记录(例如 ~/.bash_history)可能会有线索。
要了解现在打开了什么文件或谁打开了文件,请使用lsof /path/to/file.
要记录将来文件发生的情况,有几种方法:
使用inotifywait。当有人阅读时inotifywait -me access /path/to会打印一行。这个界面不会告诉你谁访问了这个文件;您可以在此行出现后立即调用,但存在竞争条件(访问可能在 lsof 开始时结束)。/path/to/ ACCESS filefilelsof /path/to/file
LoggedFS是一个可堆叠的文件系统,它提供了文件系统树的视图,并且可以通过该视图对所有访问执行更漂亮的日志记录。要对其进行配置,请参阅LoggedFS 配置文件语法。
您可以使用 Linux 的审计子系统来记录大量事情,包括文件系统访问。确保auditd守护进程已启动,然后配置要使用auditctl. 每个记录的操作都记录在/var/log/audit/audit.log(在典型分布上)。要开始观看特定文件:
auditctl -w /path/to/file
Run Code Online (Sandbox Code Playgroud)
如果您将监视放在目录上,则也会监视其中的文件及其子目录递归。
小智 7
上一个答案不是执行您所要求的最佳实践。Linux 有一个 API。该inotifyAPI http://linux.die.net/man/7/inotify
inotify直接调用APIinotify inotify特定于Linux)并且您正在使用 Java,JNotify 可以跨平台工作(Linux、Mac、Windows),抽象本机操作系统的底层 API。上面带有 inotifywait 的示例应该是其中之一(有关更多信息,请参见手册页):
inotifywait /path/to/file
inotifywait -e open /pat/to/file
Run Code Online (Sandbox Code Playgroud)
或者使用监控模式和时间戳:
inotifywait -m --format '%w:%e:%T' --timefmt '%F %T %Z %z'
Run Code Online (Sandbox Code Playgroud)