Развлекаюсь (цензура не позволяет написать правду, ггг) со своей сборкой, и понадобилось отслеживать все изменения в каталоге, скажем в /etc, чтобы потом можно было понять "а чо/как это вышло??" :) Написал на коленке скрипт, и он даже работает, но может есть какие-нибудь более профессиональные решения?
Мониторинг изменений в дереве файлов
любой софт для отслеживания руткитов это делает - rkhunter например
Забыл добавить, что нужен был лог. Короче, в итоге допилил свой скрипт, все Ок. Могу сказать, что diff для применения в скриптах чертовски неудобна, но других вариантов не нашел.
1000Mhz, А явить скрипт миру?
Там все тупо элементарно вообще-то:
#!/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
Примечание: пути с пробелами не обрабатываются - мне это не нужно и тупо лень закавычивать переменные.
Т. е. копируем каталог (rsync) в $logdir, а дальше пофайлово сравниваем его с копией с помощью diff, и записываем в лог вывод diff, а если в целевом каталоге был создан новый файл, то его содержимое целиком. В любой момент можно синхронизировать целевой каталог с копией, можно создать новый лог-файл и т. п. (см. help).
Естественно, это все юзабельно только для каталогов с относительно короткими конфигурационными файлами, типа /etc, но я собственно для него и делал.
Можно притянуть git. Контроль версий файлов -- это его родная стихия.
yars, тяжеловато, не?
К тому же мне нужен не контроль версий, а именно лог изменений. Просто_лог_файл. Ни генерации патчей, ни дерева изменений не требуется.
Хм, если всего то нужно изменения в каталоге узнать, то diff может рекурсивно обрабатывать каталог ключик -r.
пример:
[console]$ diff -urN каталог.orig каталог >file.patch[/console]
В результате все изменения будут прописаны в одном файле.
ormorph, да, тут я откровенно ступил))
Можно притянуть git.
Нет, гит точно будет извратом! Но на Генте мне это больше не нужно, там свои штуки (RCS).
Нет
Хм, ну ладно=)