[[https://pctresearch.com/|{{:banner_image.jpg?nolink&800|}}]] ===== File Access Monitor ===== {{:file_access_monitor.gif?direct&800|}} ===== install inotify-tools ===== $ sudo apt install inotify-tools The inotifywait utility can be used to wait and react to filesystem events. $ inotifywait work/aaa.txt Setting up watches. Watches established. work/aaa.txt OPEN === Use -r (--recursive) option to include subdirectories === $ inotifywait -r /home/wweb/www/html/dokuwiki Setting up watches. Beware: since -r was given, this may take a while! Watches established. /home/wweb/www/html/dokuwiki/data/pages/ OPEN zip.txt ^-m, --monitor|Instead of exiting after receiving a single event, execute indefinitely. The default behaviour is to exit after the first event occurs.| $ inotifywait -m -r /home/wweb/www/html/dokuwiki ^-d, --daemon|Same as --monitor, except run in the background logging events to a file that must be specified by --outfile. Implies --syslog.| $ inotifywait -d -o -r /home/wweb/www/html/dokuwiki :!: must be an existing file. ^--timefmt |Set a time format string as accepted by strftime(3)| $ inotifywait -d --timefmt "%a, %d %b %Y %T %z" --format "%T %w %f %e" -o ~/log/inotifylog.txt -r /home/wweb/www/html/dokuwiki $ inotifywait -d --timefmt "%a, %d %b %Y %T %z" --format "%T %w %f %e" -o ~/log/inotifylog_IIS.txt -r /mnt/e/inetpub/wwwroot/dokuwiki :!: Don't work on NTFS even by WSL. ==== Keep Detect Files' Access by inotifywait ==== $ cat /usr/local/bin/inwatch.sh #!/usr/bin/env bash mkdir -p /home/pctr/log LOGFILE=/home/pctr/log/inotify.log echo "start inotifywait. Watching.." >> $LOGFILE inotifywait -m --timefmt "%a, %d %b %Y %T %z" --format "%T %w %f %e" -e modify -e close_write -e moved_to -e moved_from -e move -e move_self -e create -e delete -e delete_self -e unmount -o $LOGFILE -r --fromfile /usr/local/bin/inotify.list :!: We will then register this shell program as a system service. So the -m option is better. $ cat /usr/local/bin/inotify.list /home/wweb/www/html/dokuwiki @/home/wweb/www/html/dokuwiki/data/pages/.git @/home/wweb/www/html/dokuwiki/data/locks @/home/wweb/www/html/dokuwiki/data/cache @/home/wweb/www/html/dokuwiki/data/index @/home/wweb/www/html/dokuwiki/data/meta ^@|When watching a directory tree recursively, exclude the specified file from being watched. The file must be specified with a relative or absolute path according to whether a relative or absolute path is given fo watched directories.| ^--fromfile |Read filenames to watch or exclude from a file, one filename per line. If filenames begin with @ they are excluded as described above. | ==== Alert When Files' Access Detected ==== $ cat /usr/local/bin/ialert.sh #!/usr/bin/env bash mkdir -p /home/pctr/log LOGFILE=/home/pctr/log/inotify.log LOGFILETMP=/home/pctr/log/inotify.tmp while inotifywait -q -e modify $LOGFILE; do tail -10 /home/pctr/log/inotify.log > $LOGFILETMP kdialog --textbox $LOGFILETMP 1024 256 tail -10 $LOGFILE | mail -s "[inotifywait alert] File Access Detected" pctresearch@pctresearch.com done :!: If you want to use the mail feature, you must first install and configure ''**Postfix**''. === Other kdialog === $ sudo apt install kdialog $ kdialog --error "File Access Detected" $ kdialog --textbox inotifylog.txt 512 256 ==== Registering in Syetem Service (inwatch.sh only)==== $ cd /etc/systemd/system/ $ sudo touch file-access-detect.service [Unit] Description=Detect Accessing to Files After=network.target StartLimitIntervalSec=20 StartLimitBurst=3 [Service] Type=simple Restart=always RestartSec=10 User=root ExecStartPre= ExecStart=/usr/local/bin/inwatch.sh ExecStartPost= ExecStop= ExecReload= [Install] WantedBy=multi-user.target $ sudo systemctl daemon-reload $ sudo systemctl enable file-access-detect.service Created symlink /etc/systemd/system/graphical.target.wants/file-access-detect.service → /etc/systemd/system/file-access-detect.service. $ sudo systemctl start file-access-detect.service ==== Registering Startup Application (ialert.sh only)==== === Ubuntu === $ cat ~/.config/autostart/ialert.sh.desktop [Desktop Entry] Type=Application Exec=/usr/local/bin/ialert.sh & Hidden=false NoDisplay=false X-GNOME-Autostart-enabled=true Name[en_US]=ialert Name=ialert Comment[en_US]=Alert when ~/log/inotify.log is updated. Comment=Alert when ~/log/inotify.log is updated. === Wsl === $ cat /etc/wsl.conf [boot] # systemd support systemd=true command = "/usr/local/bin/ialert.sh &" [user] # User settings default=pctr [network] # generate /etc/hosts generateHosts = false # generate /etc/resolv.conf generateResolvConf = false ===== File Access Detection case by case ===== |location of files^access by^wsl(inotify)^windows(Everything)^ ^inside of wsl|wsl|detect|NG| ^ |windows|detect|△ 1)| ^outside of wsl|wsl|NG|detect| ^ |windows|NG|detect| :!: 1) when windows opened the file, windows make the *.link file which can be detected. But when windows modified it, Everything can't detect it. ===== Monitor Configure Files ===== You can easily monitor configure files using the [[manage_config_with_git|Manage Configuration Files with Git]] technique. $ git ls-tree -r master --name-only /home/pctr/ /home/pctr/.bash_logout /home/pctr/.bashrc /home/pctr/.emulator_console_auth_token /home/pctr/.gitconfig /home/pctr/.gitignore /home/pctr/.pam_environment /home/pctr/.profile /home/pctr/.selected_editor /home/pctr/.ssh/authorized_keys /home/pctr/.ssh/id_rsa /home/pctr/.ssh/id_rsa.pub /home/pctr/.ssh/known_hosts /home/pctr/.sudo_as_admin_successful /home/pctr/.tmux.conf /home/pctr/.vimrc /home/pctr/.vscode/argv.json /home/pctr/.wget-hsts /home/pctr/.xinputrc $ git ls-tree -r --name-only master /etc/ .gitconfig .gitignore .pwd.lock .updated adduser.conf aliases apache2/apache2.conf apache2/conf-available/charset.conf apache2/conf-available/javascript-common.conf apache2/conf-available/localized-error-pages.conf apache2/conf-available/other-vhosts-access-log.conf apache2/conf-available/security.conf apache2/conf-available/serve-cgi-bin.conf apache2/conf-enabled/charset.conf apache2/conf-enabled/localized-error-pages.conf apache2/conf-enabled/other-vhosts-access-log.conf apache2/conf-enabled/security.conf apache2/conf-enabled/serve-cgi-bin.conf apache2/envvars apache2/ports.conf apache2/sites-available/000-default.conf apache2/sites-available/default-ssl.conf apache2/sites-available/wweb.conf apache2/sites-available/wweb_ssl.conf apache2/sites-enabled/wweb.conf apache2/sites-enabled/wweb_ssl.conf apg.conf brltty.conf ca-certificates.conf cron.d/.placeholder cron.d/anacron ... dovecot/conf.d/10-ssl.conf dovecot/dovecot.conf ... host.conf hostname hosts hosts.allow hosts.deny ... pam.conf pam.d/atd ... postfix/main.cf ... samba/smb.conf samba/smbshared.conf ... ssh/ssh_config ssh/ssh_host_rsa_key ssh/ssh_host_rsa_key.pub ssh/sshd_config ... timeshift/default.json timeshift/timeshift.json ... ufw/applications.d/apache2-utils.ufw.profile ufw/applications.d/cups ufw/applications.d/dovecot-imapd ufw/applications.d/dovecot-pop3d ufw/applications.d/openssh-server ufw/applications.d/postfix ufw/applications.d/samba ufw/sysctl.conf ufw/ufw.conf ... So, inotify.list should be : $ cat /usr/local/bin/inotify.list /home/wweb/www/html/dokuwiki @/home/wweb/www/html/dokuwiki/data/pages/.git @/home/wweb/www/html/dokuwiki/data/locks @/home/wweb/www/html/dokuwiki/data/cache @/home/wweb/www/html/dokuwiki/data/index @/home/wweb/www/html/dokuwiki/data/meta /home/pctr/.bash_logout /home/pctr/.bashrc /home/pctr/.emulator_console_auth_token /home/pctr/.gitconfig /home/pctr/.gitignore /home/pctr/.pam_environment /home/pctr/.profile /home/pctr/.selected_editor /home/pctr/.ssh/authorized_keys /home/pctr/.ssh/id_rsa /home/pctr/.ssh/id_rsa.pub /home/pctr/.ssh/known_hosts /home/pctr/.sudo_as_admin_successful /home/pctr/.tmux.conf /home/pctr/.vimrc /home/pctr/.vscode/argv.json /home/pctr/.wget-hsts /home/pctr/.xinputrc /etc/.gitconfig /etc/.gitignore /etc/.pwd.lock /etc/.updated /etc/adduser.conf /etc/aliases /etc/apache2/apache2.conf /etc/apache2/conf-available/charset.conf /etc/apache2/conf-available/javascript-common.conf /etc/apache2/conf-available/localized-error-pages.conf /etc/apache2/conf-available/other-vhosts-access-log.conf /etc/apache2/conf-available/security.conf /etc/apache2/conf-available/serve-cgi-bin.conf /etc/apache2/conf-enabled/charset.conf /etc/apache2/conf-enabled/localized-error-pages.conf /etc/apache2/conf-enabled/other-vhosts-access-log.conf /etc/apache2/conf-enabled/security.conf /etc/apache2/conf-enabled/serve-cgi-bin.conf /etc/apache2/envvars /etc/apache2/ports.conf /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/default-ssl.conf /etc/apache2/sites-available/wweb.conf /etc/apache2/sites-available/wweb_ssl.conf /etc/apache2/sites-enabled/wweb.conf /etc/apache2/sites-enabled/wweb_ssl.conf /etc/apg.conf /etc/brltty.conf /etc/ca-certificates.conf /etc/cron.d/.placeholder /etc/cron.d/anacron ... :!: Path in inotify.list should be full pathname. :!: If inotify.list contains non-existent files or directories, the service will fail.