找出哪个用户在UNIX的什么时间访问了一个特定的文件

有人可以build议我任何命令,我可以用它来查看哪些用户在UNIX的什么时间访问特定的文件。 我知道历史命令列出了以前触发的命令,但是它不包括“谁”触发它以及在什么时间。

使用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 $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" 

您可以在~/.bashrc添加以下这些行,以便history命令以[<user> 2016-05-11 14:04:33] <command>格式记录[<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

您可以使用stat来找出上次访问文件的时间。 这是唯一可能的,如果您的文件系统存储inode的一段时间。 但是这并不能告诉你谁访问了这个文件。

您可以使用lsof来列出当前正在使用文件的进程。 但是如果你的用户没有足够的权限,你可能看不到其他用户的进程(如果你是root用户,你可以看到所有的进程)。

通常, history的输出是从执行用户的历史文件生成的。 所以你可以假定history打印的命令都是由同一个用户执行的。 在某些shell中,您可以设置一个选项,以便将执行时间与命令一起存储。 那么你也可以用history来获得这个时间。 这可能取决于你正在使用的外壳。

你可以阅读statlsofbash或者zsh (或者ksh ?)的手册页来了解更多关于这个的信息。