web-dev-qa-db-ja.com

特定のフォルダーへのアクセスとその内容の変更を記録する方法は?

フォルダーのアクセス時間を追跡する必要があり、どの変更が行われたかを知りたい。

これらのイベントをトリガーするにはどうすればよいですか?フォルダーを開いたときに特定の.shファイルを実行する方法はありますか?

2
tvshajeer

私はあなたがフォルダが開かれている(時計)時間を知る必要があると仮定しますnautilus、フォルダへのアクセスにかかる時間ではなく

ウィンドウリストを使用する

コマンドwmctrl -lからウィンドウリストを取得し、フォルダー名がリストにあるかどうかを確認できます。ただし、チェックするループは、フォルダーが開いていることを確認するのに少なくとも1秒かかります。

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:
    

    (インデントに注意してください!)

Edit 2

コメントとチャットでの議論から、フォルダへのアクセスをログに記録するツールを実際に探していることを理解しています(例:nautilusによる)およびその内容の変更。
追加オプションとして、2つの異なるスレッドで記録する包括的なログスクリプト:

  • すべての場合、フォルダがアクセスされました。 nautilus、ファイルにログインaccess_log.txt
  • フォルダーのウィンドウが閉じられたすべての場合、access_log.txt
  • ディレクトリに追加された(再帰的に)、またはディレクトリから削除されてファイルdirectory_log.txtにログインしたすべてのファイル

ログの更新時間が異なるため、これらのイベントは2つの異なるファイルに記録されます。多数のサブディレクトリを持つ大きなディレクトリで発生することをリアルタイムで「記録」することは、5秒ごとに実行したいものではありません。結果は次のとおりです。

  • accessログには(設定したとおり)0.5秒の精度があります
  • directoryログ(ファイルの追加/削除)の精度は10分です。イベントは、発生後10分以内に報告され、タイムスタンプの精度は10分です。

    〜800 GBの(ネットワーク)ディレクトリでテストしました。ディレクトリが非常に小さい場合、directoryログサイクルも(非常に)小さくなります。たとえば、10秒の(ディレクトリログ)サイクルで20 GBのディレクトリでテストしました。

出力例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

スクリプト:

  • 上記のスクリプトのように設定します重要な違いあり

    • foldernameargumentとして使用する代わりに、完全なpathを設定します+スクリプトの先頭にあるフォルダー名(スクリプトの例を参照)
  • それを実行するコマンドは次のとおりです。

    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
Jacob Vlijm

Pythonの代わりにBashを使用する場合:

#!/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またはbashなしで使用できます。

chmod u+x folderwatch.sh
./folderwatch.sh BackupSSD
1
Panta

Sudo apt-get incron「inotify cron」システムをインストールする

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 からの詳細情報

それは単純で、一見そうですが、複雑な操作の構文はregularbash、cf、 https:/ /stackoverflow.com/questions/23706194/using-zenity-in-a-root-incron-job-to-display-message-to-currently-logged-in-user

0
Nodak