Как мы можем узнать, какой пользователь создал файл в папке, используя inotify и сценарии оболочки?

Здравствуйте, мне нужна небольшая помощь, пожалуйста:

У меня есть упражнение, которое я хочу сделать, это:

Создайте сценарий для мониторинга КАТАЛОГА и для каждого создания файла добавляйте новую строку в register_file, показывающую дату и час, имя файла и имя пользователя, создавшего файл.

Я пробовал:

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

Но как узнать имя пользователя?

Спасибо.

Моей первой интуицией было бы увидеть / proc. Я изучал man inotifywait, inotifywatch и incron, но ничего не помогает.

0
10.12.2016, 11:21
2 ответа

Вот bash-скрипт, который вы можете запустить и который выдаст вам владельца. Вместо echo владельца вы можете записать его в register_file

#! /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, вы легко получите владельца.

EDIT:

Из man 7 inotify:

"Ограничения и предостережения... API inotify не предоставляет никакой информации о пользователе или процессе, который" инициировал событие inotify.

0
28.01.2020, 02:47

Disclaimer:
Ни в коем случае не являясь экспертом в 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. Она находится в моем списке TODO, поэтому я решил использовать stat вместо нее.

1
28.01.2020, 02:47

Теги

Похожие вопросы