Como podemos saber qual usuário criou um arquivo em uma pasta, usando inotify e shell scripts?

0

Olá eu preciso de um pouco de ajuda, por favor:

Eu tenho um exercício que eu quero fazer é:

Crie um script para monitorar um DIRETÓRIO e para a criação de cada arquivo anexar uma nova linha em um register_file mostrando a data e a hora, o nome do arquivo e o nome do usuário que criou o arquivo.

Eu tentei:

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

Mas como posso descobrir o nome do usuário?

Obrigado.

Minha primeira intuição seria ver / proc. Eu estudei homem inotifywait inotifywatch e incron, mas nada ajuda.

    
por enoy 10.12.2016 / 10:21

2 respostas

1

Aviso de isenção :
Não é de forma alguma um especialista em inotify , eu vi isso como uma oportunidade para realmente aprender algo novo. Com isso fora do caminho, aqui está minha abordagem:

#!/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

Após a execução:

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

Quando eu adiciono um arquivo ao diretório toWatch de outro terminal:

touch toWatch/a_file

... esta é a saída que recebo:

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

E, adicionando outro arquivo ...

touch toWatch/another_file

Dá ...

./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

Claro, se você quiser que a saída seja redirecionada para um arquivo, você terá que implementar essa parte.

Isso é baseado na postagem do @jasonwryan aqui . Mas ainda não descobri a opção --format para inotifywait . Está na minha lista TODO, portanto escolho usar stat .

    
por 10.12.2016 / 12:32
0

Aqui está um script que você pode executar e lhe dará o dono. Em vez de ecoar o dono, você pode escrever o arquivo 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

na verdade, se você usar stat --format=%U $fName , conseguirá o proprietário facilmente.

EDITAR:

Do homem 7 inotify:

"Limitações e ressalvas-        A API inotify não fornece informações sobre o usuário ou processo que "        desencadeou o evento inotify.

    
por 10.12.2016 / 11:56

Tags