LinuxForum.Fans
Тема

Мониторинг изменений в дереве файлов

Автор: 1000Mhz 11 сообщений 1169 просмотров
15.09.2017 19:29 #425140

Развлекаюсь (цензура не позволяет написать правду, ггг) со своей сборкой, и понадобилось отслеживать все изменения в каталоге, скажем в /etc, чтобы потом можно было понять "а чо/как это вышло??" :) Написал на коленке скрипт, и он даже работает, но может есть какие-нибудь более профессиональные решения?

15.09.2017 23:08 #425143

любой софт для отслеживания руткитов это делает - rkhunter например

16.09.2017 14:01 #425144

Забыл добавить, что нужен был лог. Короче, в итоге допилил свой скрипт, все Ок. Могу сказать, что diff для применения в скриптах чертовски неудобна, но других вариантов не нашел.

16.09.2017 16:25 #425145

1000Mhz, А явить скрипт миру?

16.09.2017 16:43 #425146

Там все тупо элементарно вообще-то:

text
#!/bin/sh
help() {
    echo -e "   path-to-dir   action: \ndiff - write diff log, \nsync - sync files and exit, \nstartnew - start new log file, \nlistnew - list changes (only NEW lines)"
}
if [ -z $1 ]
then
    echo "Usage: path-to-dir action [description]"
    exit 1
elif [ "$1" = "--help" ]
then
    help
    exit 1
fi
aprefix=$(echo $1 | sed 's/\/$//')
logdir=/path/to/logdir
N=$(ls $logdir/$(basename $1)*.log | grep -Eo '[0-9]+' | sort -n | tail -1)
logfile=$logdir/$(basename $1)$N.log
bprefix=$logdir/"$(basename $1).0"
! [ -d "$bprefix" ] && echo "Please copy $1 in $logdir manually" && exit 1
FILES=( "$(cd $1 && find . -type f | grep -Ev '.*[Cc]ache.*' |sed 's/^..//g')" )
DIFF=""
d0='#################################################################################'
desc="$3"

case "$2" in startnew ) logfile=$logdir/$(basename $1)$((N + 1)).log ;; listnew ) cat $logfile | sed -e '/^\ \ >.*/d' -e 's/\ \ </\ \ +/g' | less exit 0 ;; sync ) rsync -av $aprefix/ $bprefix exit 0 ;; diff ) echo "Compare..." ;; * ) help exit 1 ;; esac

gdate() { ### HERE: insert date function } gdiff() { local out=/var/tmp/diffout diff -B $1 $2 > $out 2>/dev/null case $? in 0 ) return 1 ;; # одинаковые 1 ) DIFF=$out # разные return 0 ;; 2 ) DIFF=$1 # файл 2 не существует return 0 ;; esac }

echo -n "DATE: " >> $logfile gdate >> $logfile echo "DESC: $desc" >> $logfile echo "$d0" >> $logfile for i in ${FILES[@]} do if gdiff $aprefix/$i $bprefix/$i then echo "FILE: $aprefix/$i" >> $logfile cat $DIFF | sed 's/^/\ \ /g' >> $logfile echo >> $logfile fi done >&2 echo " Записано: $logfile" exit

Примечание: пути с пробелами не обрабатываются - мне это не нужно и тупо лень закавычивать переменные.

16.09.2017 17:16 · отредактировано #425147

Т. е. копируем каталог (rsync) в $logdir, а дальше пофайлово сравниваем его с копией с помощью diff, и записываем в лог вывод diff, а если в целевом каталоге был создан новый файл, то его содержимое целиком. В любой момент можно синхронизировать целевой каталог с копией, можно создать новый лог-файл и т. п. (см. help).

Естественно, это все юзабельно только для каталогов с относительно короткими конфигурационными файлами, типа /etc, но я собственно для него и делал.

17.09.2017 16:52 #425169

Можно притянуть git. Контроль версий файлов -- это его родная стихия.

17.09.2017 17:28 #425170

yars, тяжеловато, не?
К тому же мне нужен не контроль версий, а именно лог изменений. Просто_лог_файл. Ни генерации патчей, ни дерева изменений не требуется.

17.09.2017 18:45 #425171

Хм, если всего то нужно изменения в каталоге узнать, то diff может рекурсивно обрабатывать каталог ключик -r.
пример:
[console]$ diff -urN каталог.orig каталог >file.patch[/console]
В результате все изменения будут прописаны в одном файле.

21.09.2017 19:30 · отредактировано #425286

ormorph, да, тут я откровенно ступил))

"yars" написал:
Можно притянуть git.

Нет, гит точно будет извратом! Но на Генте мне это больше не нужно, там свои штуки (RCS).

21.09.2017 19:37 #425288
"1000Mhz" написал:
Нет

Хм, ну ладно=)

Войдите или зарегистрируйтесь, чтобы ответить.