在UNIX系统中,查找访问特定文件的用户和时间

4

有没有什么命令可以在UNIX系统中查看哪个用户在什么时间访问了特定的文件?我知道history命令会列出之前执行过的命令,但它不包括是谁执行的以及执行时间。


您可以通过 HISTTIMEFORMAT 环境变量记录历史时间。请参阅 man history。还可以查看 http://unix.stackexchange.com/questions/144845/how-would-you-get-all-users-history。 - Ruslan Osmanov
@RuslanOsmanov,你有“history”命令的手册页吗?我在Arch Linux上没有找到。对我来说,它是“bash”或“zsh”的内置命令。 - Lucas
@Lucas,“man history”为我打开了“BASH_BUILTINS(1)”手册页。 - Ruslan Osmanov
3个回答

2

使用Linux的auditd来监控特定文件

http://www.cyberciti.biz/tips/linux-audit-files-to-see-who-made-changes-to-a-file.html

示例

假设我有一个文件(假设为$HOME/an_important_file.txt),我想要监视所有对它的访问。首先设置它的审计规则:

$ sudo auditctl -w $PWD/an_important_file.txt -p warx -k watch_an_important_file

我已经查看了审计日志:

$ sudo ausearch -k watch_an_important_file
----
time->Thu May 12 10:54:16 2016
type=CONFIG_CHANGE msg=audit(1463039656.913:278): auid=500 ses=1 subj=unconfined_u:unconfined_r:auditctl_t:s0-s0:c0.c1023 op="add rule" key="watch_an_important_file" list=4 res=1

然后我使用touch命令修改了文件($ touch $HOME/an_important_file.txt)。我再次检查审计日志:

$ sudo ausearch -k watch_an_important_file
----
time->Thu May 12 10:54:16 2016
type=CONFIG_CHANGE msg=audit(1463039656.913:278): auid=500 ses=1 subj=unconfined_u:unconfined_r:auditctl_t:s0-s0:c0.c1023 op="add rule" key="watch_an_important_file" list=4 res=1
----
time->Thu May 12 10:56:42 2016
type=PATH msg=audit(1463039802.788:291): item=1 name=(null) inode=535849 dev=fd:02 mode=0100664 ouid=500 ogid=500 rdev=00:00 obj=unconfined_u:object_r:user_home_t:s0 nametype=NORMAL
type=PATH msg=audit(1463039802.788:291): item=0 name="/home/Sergey.Kurenkov/" inode=524289 dev=fd:02 mode=040700 ouid=500 ogid=500 rdev=00:00 obj=unconfined_u:object_r:user_home_dir_t:s0 nametype=PARENT
type=CWD msg=audit(1463039802.788:291):  cwd="/usr"
type=SYSCALL msg=audit(1463039802.788:291): arch=c000003e syscall=2 success=yes exit=3 a0=7fff6d986060 a1=941 a2=1b6 a3=3149b8f14c items=2 ppid=4852 pid=10022 auid=500 uid=500 gid=500 euid=500 suid=500 fsuid=500 egid=500 sgid=500 fsgid=500 tty=pts1 ses=1 comm="touch" exe="/bin/touch" subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 key="watch_an_important_file"

肯定优先选择这个答案,而不是这个答案 - hek2mgl

1
你可以使用stat来查找文件上一次访问的时间。这仅在您的文件系统存储了索引节点的atime时才可能。但这并不告诉您是谁访问了该文件。
您可以使用lsof列出当前使用文件的进程。但如果您的用户权限不足,则可能看不到其他用户的进程(如果您是root,则可以查看所有进程)。
通常,history的输出是从执行用户的历史文件生成的。因此,您可以假设由history打印的命令都是由同一个用户执行的。在某些shell中,您可以设置一个选项,以便将执行时间与命令一起存储。然后您也可以使用history获取这个时间。这可能取决于您正在使用的shell。
您可以阅读statlsofbashzsh(或者也许是ksh?)的手册,以了解更多信息。

1
您可以在~/.bashrc中添加以下行,这样history命令就会以[<user> 2016-05-11 14:04:33] <command>的格式记录命令。下面的命令适用于所有打开的交互式终端。
export HISTFILESIZE=100000000     
export HISTSIZE=100000000

# First two are optional, they need to be changed only if the default 500
# lines history logging needs to be changed

export HISTTIMEFORMAT="[$USER %F %T] "
HISTCONTROL=ignoredups:erasedups
shopt -s histappend
PROMPT_COMMAND="history -n; history -w; history -c; history -r; $PROMPT_COMMAND"

原始的 答案 经过修改后存储了 $USER


1
这可以放在/etc/bash.bashrc中,以便适用于所有用户。 - Thirupathi Thangavel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接