我们如何使用 inotify 和 shell 脚本知道哪个用户在文件夹中创建了文件?

我们如何使用 inotify 和 shell 脚本知道哪个用户在文件夹中创建了文件?

您好,我需要一点帮助,请:

我有一个我想做的练习是:

创建一个脚本来监视目录,并为每个文件的创建在 register_file 中添加一个新行,显示日期和时间、文件名以及创建该文件的用户名。

我努力了:

inotifywait -m  -e create -o register_file --timefmt '%d-%m-%Y-%H:%M' --format '%T %f' ./

但是我怎样才能找到用户的名字呢?

谢谢。

我的第一直觉是查看 /proc。我研究了 man inotifywait inotifywatch 和 incron 但没有任何帮助。

答案1

免责声明
绝不是专家inotify,我认为这是一个真正学习新东西的机会。排除了这一点,这是我的方法:

#!/bin/bash

watchedDir="toWatch"

inotifywait -m "$watchedDir" -e create |
    while read -r file; do
        name=$(stat --format %U $file 2>/dev/null) 
        date=$(stat --format %y $file 2>/dev/null)
        fileName=${file/* CREATE /}
        echo "File: '$fileName' Creator: $name Date: ${date%.*}"
    done

执行后:

./watchDir.sh 
Setting up watches.
Watches established.

toWatch当我从另一个终端将文件添加到目录时:

touch toWatch/a_file

...这是我得到的输出:

./watchDir.sh 
Setting up watches.
Watches established.
File: 'a_file' Creator: maulinglawns Date: 2016-12-10 12:29:42

并且,添加另一个文件...

touch toWatch/another_file

给...

./watchDir.sh 
Setting up watches.
Watches established.
File: 'a_file' Creator: maulinglawns Date: 2016-12-10 12:29:42
File: 'another_file' Creator: maulinglawns Date: 2016-12-10 12:31:15

当然,如果您希望输出重定向到文件,则必须实现该部分。

这是基于@jasonwryan 的帖子这里。但我还没有想出这个--format选择inotifywait。它在我的待办事项列表中,因此我选择使用它stat

答案2

这是一个 bash 脚本,您可以运行它并为您提供所有者。您可以将其写入 register_file,而不是 echo 所有者

#! /bin/bash

export fCreation=$(tail -1 ./register_file) #get the newest file creation documentation
export fName=${fCreation##* } #get the last word, which is the file name

export details=$(ls -al | grep $fName)

export owner=${details#* } #removes the file's permissions
owner=${owner#* }
owner=${owner#* }
owner=${owner%% *}

echo $owner

事实上,如果你使用stat --format=%U $fName你会很容易得到主人。

编辑:

来自 man 7 inotify:

“限制和警告 - inotify API 不提供有关触发 inotify 事件的用户或进程的信息。”

相关内容