Как зарегистрировать доступ к определенной папке и изменениям в ее содержании?

Я должен отследить время доступа папки и хотеть знать то, какие изменения внесены в него.

Как я инициировал те события? Существует ли способ выполнить определенный .sh файл, когда папка открыта?

2
задан 19 February 2015 в 14:05

3 ответа

Я предполагаю, что необходимо знать (часы-) время, папка открыта в, например, наутилус, не время, которое требуется для доступа к папке.

Используя список окна

Можно получить список окна от команды wmctrl -l, и посмотрите, происходит ли имя папки в списке. Цикл для проверки однако занял бы, по крайней мере, долю секунды, чтобы заметить, что папка открыта.

Вы имели бы wmctrl быть установленным:

sudo apt-get install wmctrl

В примере ниже, сценарий выполняет команду, когда к папке получают доступ впервые, и выходы.

Как использовать:

  • Вставьте сценарий в пустой файл
  • Сохраните его как access_time.py
  • Изменение в главном разделе сценария "<command_to_run>" Вашей командой (между кавычками)
  • Выполните его любой с командой:

    python3 </path/to/script> <foldername_without_path>
    

    или, если Вы сделали это исполняемым файлом:

    </path/to/access_time.py> <foldername_without_path>
    
#!/usr/bin/env python3
import subprocess
import sys
#--- replace "<command_to_run>" with your command (between quotes):
command = "<command_to_run>"
#---
foldername = sys.argv[1]
while True:
    try:
        test = subprocess.check_output(["wmctrl", "-l"]).decode("utf-8")
    except subprocess.CalledProcessError:
        pass
    if foldername in test:
        subprocess.call(["/bin/bash", "-c", command])
        break

Править

Можно однако заставить его работать "единый", таким образом, Вам не нужен другой сценарий. Сценарий ниже создает файл в Вашем каталоге $HOME со временем, к Вашей папке получили доступ.:

#!/usr/bin/env python3
import subprocess
import sys
import os
import time
home = os.environ["HOME"]
foldername = sys.argv[1]

#--- the path your file is saved to (change if you want to, but use full paths)
path = home
#---

while True:
    try:
        test = subprocess.check_output(["wmctrl", "-l"]).decode("utf-8")
    except subprocess.CalledProcessError:
        pass
    if foldername in test:
        with open(path+"/time_data.txt", "a") as out:
            out.write("the folder "+foldername+" was opened "+time.ctime()+"\n")
        break
  • Используйте его точно так же, как первая опция (но очевидно Вы не должны устанавливать команду),
  • Поместите точка перед именем файла для создания этого скрытым файлом (нажмите Ctrl+H для переключения видимости):

    Если Вы хотите это, изменение:

    with open(path+"/time_data.txt", "a") as out:
    

    в:

    with open(path+"/.time_data.txt", "a") as out:
    

    (Следите за отступом!)

Редактирование 2

Из Ваших комментариев и обсуждения в чате, я понимаю, что Вы на самом деле ищете инструмент для входа доступа к папке (например, наутилусом) и изменения в содержании его.
Как дополнительная опция, всесторонний сценарий журнала, который записывает в двух различных потоках:

  • Все случаи папкой получили доступ, например, наутилус, вошел в систему файл access_log.txt
  • Все случаи, что окно папки закрылось, также вошли в систему access_log.txt
  • Все файлы это, где или добавленный к (рекурсивно), или удаленный из каталога, вошел в файл directory_log.txt

Эти события зарегистрированы два различных файла, потому что журналы имеют различные времена обновления. "Запись" в реальном времени того, что происходит с большим каталогом с большим количеством подкаталогов, не является чем-то, что Вы хотели бы быть сделанными каждые 5 секунд или около этого. Последствие то, что:

  • журнал доступа имеет (когда я установил его), точность 0,5 секунд
  • журнал каталога (добавляющий/удаляющий файлы) имеет точность 10 минут. О событиях сообщат в течение 10 минут после происходящий с точностью метки времени 10 минут.

    Я протестировал его на (сеть-) каталог ~800 ГБ. Если Ваш каталог является значительно уменьшенным, журнал каталога - цикл может быть (намного) меньшим также. Я протестировал его, например, на каталоге на 20 ГБ, с (журнал каталога) цикл 10 секунд.

Пример произвел access_log.txt:

---------------Thu Feb 19 21:01:09 2015---------------
folder opened

---------------Thu Feb 19 21:01:27 2015---------------
folder closed

Пример произвел directory_log.txt:

---------------Thu Feb 19 21:14:24 2015---------------
+ /home/jacob/Afbeeldingen/Downloads/2023.pdf
- /home/jacob/Afbeeldingen/Downloads/History-journal
- /home/jacob/Afbeeldingen/Downloads/google-earth-stable_current_i386.deb

Сценарий:

  • Настройте его как сценарии выше с важным различием:

    • вместо того, чтобы использовать foldername в качестве аргумента, набор полный path+the foldername в заголовке сценария (см. пример в сценарии),
  • Команда для выполнения его затем:

    python3 /path/to/script.py
    
#!/usr/bin/env python3
import subprocess
import os
import time
import difflib
from threading import Thread
home = os.environ["HOME"]

# The folder to watch:
folder = "/home/jacob/Afbeeldingen"
# the path your log files are saved to (change if you want to, but use full paths):
path = home
#---

for f in os.listdir(path):
    if f.startswith("dr_check_"):
        os.remove(path+"/"+f)

dr_data = path+"/directory_log.txt"
access_data = path+"/access_log.txt"

for f in [dr_data, access_data]:
    if not os.path.exists(f):
        subprocess.Popen(["touch", f])       
foldername = folder.split("/")[-1]

def check_windowlist(foldername):
    while True:
        try:
            if foldername in subprocess.check_output(["wmctrl", "-l"]).decode("utf-8"):
                return "folder opened\n"
            else:
                return "folder closed\n"
            break
        except subprocess.CalledProcessError:
            pass

def check_directory(directory, outfile):
    with open(outfile, "wt") as out:
        for root, dirs, files in os.walk(directory):
            for f in files:
                out.write(root+"/"+f+"\n")

def run_accesscheck():
    while True:
        ch1 = check_windowlist(foldername)
        time.sleep(0.5)
        ch2 = check_windowlist(foldername)
        if ch1 != ch2:
            with open(access_data, "a") as out:
                out.write("-"*15+time.ctime()+"-"*15+"\n"+ch2+"\n")

def run_directorycheck():
    last = 1; outfile_name = "dr_check_"; last_outfile = ""
    while True:
        outfile = path+"/"+outfile_name+str(last)+".txt"
        check_directory(folder, outfile)
        if last != 1:
            changes = []
            diff = difflib.ndiff(
                open(last_outfile).readlines(),
                open(outfile).readlines()
                )
            for item in diff:
                if item.startswith("-") or item.startswith("+"):
                    changes.append(item)
            if len(changes) > 0:
                with open(dr_data, "a") as out:
                    out.write("-"*15+time.ctime()+"-"*15+"\n")
                    for it in sorted(changes):
                        out.write(it)
                    out.write("\n")
            os.remove(last_outfile)       
        last_outfile = outfile; last = last+1
        time.sleep(600)

Thread(target = run_directorycheck).start()
Thread(target = run_accesscheck).start()
3
ответ дан 2 December 2019 в 02:23

Если Вы хотите использовать Bash вместо этого Python:

#!/bin/bash
folder=$1
while true;
do
    command=$(wmctrl -l | grep -o "$folder")
    if [[ "$folder" == "$command" ]];
    then
        ./myscript.sh
        break;
    fi
done

Редактирование:

я изменил сценарий, таким образом, можно выполнить его со следующей командой:

bash folderwatch.sh BackupSSD

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

chmod u+x folderwatch.sh
./folderwatch.sh BackupSSD
1
ответ дан 6 October 2019 в 01:00

sudo apt-get incron устанавливать "inotify крон" система

http://inotify.aiken.cz/?section=incron&page=about&lang=en

echo $USER | sudo tee --append /etc/incron.allow позволить Вам играть в игру.

icrontab -e создать событие для наблюдения. Это открывается nano.

Введите требование своей основы. например,

/home/nodak/watched_dir IN_ACCESS /home/nodak/bin/personal.sh

Сохраните и протестируйте.

Больше информации из http://manpages.ubuntu.com/manpages/saucy/man5/incrontab.5.html

В то время как это просто, и обманчиво так, синтаксис для сложных маневров является не совсем тем же как регулярным ударом, c.f., https://stackoverflow.com/questions/23706194/using-zenity-in-a-root-incron-job-to-display-message-to-currently-logged-in-user

0
ответ дан 2 December 2019 в 02:23

Другие вопросы по тегам:

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