LinuxForum.Fans
Тема

Отслеживание событий файловой системы

Автор: chizh 22 сообщений 7976 просмотров
#91050

Задача: следить рекурсивно за записью/изменением в папке файлов с определенной маской расширений.

Для чего нужно: Ubuntu Server 10.10 есть папка "/путь/к/папке/share" - является файлопомойкой Samba, есть консольный сканер DrWeb открученый от DrWeb Live CD и прикрученый к серваку, скрипт на еженочное сканирование работает идеально, хотелось бы соорудить монитор файловой системы, который бы включал сканер как только в какой либо папке был записан или изменен исполняемый файл(exe, bin, com, bat, cmd, pif).

пробовал INCRON - почти то что нужно запускает сам скрипт, ничего проверять не надо, и передает в скрипт имя записанного файла(обрабатывай - нехочу), но есть один огромный минус - не умеет работать рекурсивно, перечислить папки не вариант - их много и они не постоянные

пробовал INOTIFYWATCH менее удобно, но пойдет, умеет работать рекурсивно, но минус здесь еще важнее - INOTIFYWATCH выводит только пути к папкам в которых происходили события, а нужно знать что именно записалось, чтобы определить что сканировать и сканировать ли вообще.

вижу 3 варианта решения:
заставить incron работать рекурсивно
заставить inotifywatch показывать имена файлов
использовать чтото другое - ЧТО? и где почитать?

=========================================================================

Выношу результат исследований в 1й пост:

DrWed Scaner + Updater (ключ до 2013 года) + Файловый монитор на основе InotifyWait + Shell script
http://depositfiles.com/files/4e9fooc9a

DrWed Scaner + Updater (ключ до 2013 года) + Файловый монитор на основе "find newer file" - Shell script
http://depositfiles.com/files/m6vvch2t7

пробуйте/дорабатывайте/пользуйтесь кому интересно......................

#91146

Inotify умеет записывать в файл изменения, grep-ом этот файл файл и переделать скрипт чтобы он работал с файлом в который записываются изменения.

#91258
chizh написал:
вижу 3 варианта решения:

4)

text

#!/bin/sh
[ -s file.list ] || touch file_list
find /path/ -regex ".*\.\(exe\|bat\|pdf\)$" -newer file.list >file.list.new
[ -s file.list.new ] && DrWeb_scaner file.list.new
mv file.list.new file.list

Этот скрипт в crontab, с желаемым временем сканирования.
Принцип прост (по строкам):
2) если нет списка - создаём
3) ищем файлы с "расширением" exe, bar, и pdf, которые изменились после создания списка, и помещаем их в новый список
4) если новый список не пуст, запускаем сканер со списком (чтоб знал, что сканировать)
5) перемещаем новый список в старый

отладка - дело ваше. спрашивайте, если что...

#91304
drBatty написал:

#!/bin/sh
[ -s file.list ] || touch file_list
find /path/ -regex ".*\.\(exe\|bat\|pif\)$" -newer file.list >file.list.new
[ -s file.list.new ] && DrWeb_scaner file.list.new
mv file.list.new file.list

Этот скрипт в crontab, ..................

на сколько я правильно понял этот скрипт - поиск всех файлов по всей папке подходящих по маске и сравнение с пердыдущим списком.
происходить подобный поиск будет оч долго, и список будет оч длинный (файлопомойка около 400ГБ и минимум половина в ней виндовый софт - дрова на все подряд и под все подряд, проги, игрухи - ибо моя контора занимается ремонтом компов)
и на сколько я понял этот скрипт не отслеживает переписанных файлов (вариант если вирус с ремонтируемого компа добирается до исполняемых файлов в шаре) - может быть я и не прав.........
ну и учитывая медленность этого варианта он врядли обеспечит соответствующую оперативность.....

Lupo Alberto написал:

Возможно, вам подойдёт dazuko.

Не плохой вариант - попробую если нарою по нему норм документацию - на сколько я понял этот инструмент юзают многие АВ мониторы под *nix - но восновном инфа по исправлению багов работы с антивирями и по установке - по разработке своих решений на основе Dazuko пока не нарыл

antaeus написал:

Inotify умеет записывать в файл изменения, grep-ом этот файл файл и переделать скрипт чтобы он работал с файлом в который записываются изменения.

Гдето видал что Inotify можно юзать просто - без построенных на ней incron и inotify tools но так и не нашел нормального примера скрипта по слежению за файловой системой - может быть направите?

#92429

Что делать с Inotify и Dazuko так и не разобрался, зато приручил INOTIFYWAIT

получилось 2 основных скрипта:
1) в бесконечном цыкле следит за папкой, с помощью inotifywait и записывает пути файлов, интересных для сканирования, в список
2) запускается из crontab каждую минуту и проверяет: если список пуст - ничего не делает, если не пуст запускает скан по списку

Итого получился бесплатный консольный DrWeb Scaner со сторонним файловым монитором - кому интересно - могу поделиться.............

#92539
chizh написал:
на сколько я правильно понял этот скрипт - поиск всех файлов по всей папке подходящих по маске и сравнение с пердыдущим списком.
происходить подобный поиск будет оч долго, и список будет оч длинный (файлопомойка около 400ГБ и минимум половина в ней виндовый софт - дрова на все подряд и под все подряд, проги, игрухи - ибо моя контора занимается ремонтом компов)

неправильно. это поиск всех файлов НОВЕЕ списка. что до быстродействия - а вы проверьте, прежде чем делать такие выводы. я работаю с каталогами содержащими сотни тысяч файлов, и ничего...
зачем поменяли pdf на pif? впрочем как хотите - это ваше дело. через \| можно добавлять любое количество "расширений".

chizh написал:
и на сколько я понял этот скрипт не отслеживает переписанных файлов (вариант если вирус с ремонтируемого компа добирается до исполняемых файлов в шаре) - может быть я и не прав.........

Не правы. -newer file ищет все файлы, дата модификации которых больше даты файла.

chizh написал:
ну и учитывая медленность этого варианта он врядли обеспечит соответствующую оперативность.....

ага. а я - идиот. тесты в студию! обычно такая find БЫСТРЕЕ чем все остальные решения.

chizh написал:
Итого получился бесплатный консольный DrWeb Scaner со сторонним файловым монитором - кому интересно - могу поделиться.............

для начала сравните быстродействие с моим скриптом.

#99479

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

inotifywait с реакцией на close_write + moved_to ловит все скопированные, записанные, перезаписанные, перемещенные, и переименованные файлы

#99480
chizh написал:
производительность действительно шикарная перечисляет папку за несколько секунд

это много или мало?

chizh написал:
не реагирует на свеже скопированные и свеже переименованные файлы (то есть если я изменяю файл позже списка, или создаю - скрипт его ловит, а если просто копирую или переименовываю файл который был создан и изменен хз когда - 0 эммоций)

дык и не должен. зачем проверять уже скопированное?
а... понял. find -newer ищет по дате модификации. есть ещё -anewer и -cnewer. для поиска по дате последнего доступа, и пог дате последнего изменения статуса (создание, смена прав и.т.д)
ну и наконец есть -newerXY

-newerXY reference
Compares the timestamp of the current file with reference. The reference argument is normally the
name of a file (and one of its timestamps is used for the comparison) but it may also be a string
describing an absolute time. X and Y are placeholders for other letters, and these letters select
which time belonging to how reference is used for the comparison.

a The access time of the file reference
B The birth time of the file reference
c The inode status change time of reference
m The modification time of the file reference
t reference is interpreted directly as a time

Some combinations are invalid; for example, it is invalid for X to be t. Some combinations are not
implemented on all systems; for example B is not supported on all systems. If an invalid or unsup‐
ported combination of XY is specified, a fatal error results. Time specifications are interpreted
as for the argument to the -d option of GNU date. If you try to use the birth time of a reference
file, and the birth time cannot be determined, a fatal error message results. If you specify a
test which refers to the birth time of files being examined, this test will fail for any files
where the birth time is unknown.

обратите внимание: нужна Linux based FS (ext4 и т.д.) FAT 16 ЕМНИП только 1 дату сохраняет.
И ещё - также важна FS для быстродействия. NTFS - не родная, даже если и работает, то очень медленно. FAT так вообще жутко тормозит

#99481
chizh написал:
кому интересно - могу поделиться.............

дык выкладывайте прямо здесь.

PS: я тут подумал, может будет быстрее, если убрать тест -regex ...
и проверять имена вот так:
find \( -iname "*.exe" -o -iname "*.pif" -o -iname "*.что-то-там-ещё" \)

попробуйте поиграться с созданием новой ФС (это по вендоваму "форматирование"), в mkfs.ext4 множество опций для этого. Это если время есть. Насколько я знаю, никто таких тестов не производил. Все форматируют "абы как захотелось маинтейнеру"... А маинтейнеры ставят опции "для всех", потому в таких случаях они не оптимальны. Например, непонятно, зачем в файлопомойке 5% резерва. Жалко. А резерв не нужен, всё равно руту туда нельзя. Резерв нужен на корне, на /var (и то - не для всех), может быть на /tmp. Файлопомойки удобнее всего делать в /home, а тудда заходят лишь пользователи (ну так должно-быть, ИМХО)

#99694

Файловой системе несколько дней (до этого на серваке стояла вин серв 2003 - сменил винт и поставил ubuntu - ибо более или менее на эксперементальной машине довел конфиги всех сервисов до нормального функционирования)

так что данные все были скопированы с другого винта (NTFS) на текущий (ReiserFS)

раздел под файлопомойку отдельный и смонтирован в отдельную точку монтирования (не входит в стандартные папки корневой системы)

в /home не вижу смысла потому что сервером как таковым никто не пользуется и единственный пользователь нужен только для ssh входа, у сервака даже монитора клавы и мыши нет))))

З. Ы. не наблюдаю прямой связи между созданием новой файловой системы и датами создания файлов, потому что когда с другого компа файл попадает в файлопомойку средствами самбы, и при этом имеет дату изменения "давным давно" (на исходном компе), скрипт его не находит - по вполне видимым причинам

#99754
chizh написал:
не наблюдаю прямой связи между созданием новой файловой системы и датами создания файлов, потому что когда с другого компа файл попадает в файлопомойку средствами самбы, и при этом имеет дату изменения "давным давно" (на исходном компе), скрипт его не находит - по вполне видимым причинам

так может при этом ctime файла изменяется? ИМХО - должна.
у меня меняется (и дата модификации и дата смены статуса)

text
doc@bx:~$ stat ca.c #новый
  File: `ca.c'
  Size: 425           Blocks: 8          IO Block: 4096   обычный файл
Device: 306h/774d    Inode: 673710      Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/     doc)   Gid: (  100/   users)
Access: 2010-11-05 02:58:08.415126816 +0300
Modify: 2010-11-16 21:42:36.726591011 +0300
Change: 2010-11-16 21:42:36.726591011 +0300
doc@bx:~$ ssh aranei stat ca.c #исходный
  File: `ca.c'
  Size: 425           Blocks: 8          IO Block: 4096   regular file
Device: 308h/776d    Inode: 21540       Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/  aranei)   Gid: (  100/   users)
Access: 2010-11-16 21:49:59.416097235 +0300
Modify: 2010-11-05 02:59:03.752136631 +0300
Change: 2010-11-05 02:59:03.752136631 +0300

но это по scp и в Ext4

Есть и "дата создания", как в Windows. Только она у меня не поддерживается.

#99768
text

  File: `image.iso'
  Size: 4428136448    Blocks: 8657150    IO Block: 4096   обычный файл
Device: 804h/2052d    Inode: 173302      Links: 1
Access: (0766/-rwxrw-rw-)  Uid: (65534/  nobody)   Gid: (65534/ nogroup)
Access: 2010-11-16 15:47:49.000000000 +0300
Modify: 2010-08-19 10:28:00.000000000 +0400
Change: 2010-11-14 15:31:09.000000000 +0300

Так это выглядит у мну на ReiserFS - видите 14.11.2010 я его туда скопировал, 16.11.2010 обращался к нему, а дата модификации у него 19.08.2010 - дата его создания на старой ФС

и все файлы так копируются при чом newer file реагирует именно на дату модификации

#99781
chizh написал:
Change: 2010-11-14 15:31:09.000000000 +0300
chizh написал:
и все файлы так копируются при чом newer file реагирует именно на дату модификации

ну смените на -newer на -cnewer, раз у вас почему-то такая беда.

#99790

попробую сделать с 2 финдами - чтоб наверняка

как опробую скажу что получилось

#99810
chizh написал:
попробую сделать с 2 финдами - чтоб наверняка

не надо двух!

text
find \( -newer file -o -cnewer file \) ....

как раз для этого. -o значит ИЛИ, и в скобках, т.к. приоритет -o меньше -and (-and не пишется, но оно есть)
скобки в слешах, потому-что иначе они не дойдут до find, а обработаются оболочкой

#100164

спасибо конечно, но 50 метров мне не скачать :(

#100241

Исходя из того, что было описано в первом посте, я заключил, что никаких inotify тут не надо. Самба сама умеет проверять файлы при загрузке или изменении. Нужно лишь подключить нужный модуль в конфиге.

Как это настроить с DrWeb есть вот тут [url=ftp://ftp.drweb.com/pub/drweb/unix/.../doc/drweb-file-servers-500-linux-ru.pdf]ftp.drweb.com/pub/drweb/unix/.../doc/drweb-file-servers-500-linux-ru.pdf[/url] (глава 7).

Надеюсь, это то, что хотел автор =).

#100251
elve написал:
Исходя из того, что было описано в первом посте, я заключил, что никаких inotify тут не надо. Самба сама умеет проверять файлы при загрузке или изменении. Нужно лишь подключить нужный модуль в конфиге.

Как это настроить с DrWeb есть вот тут [url=ftp://ftp.drweb.com/pub/drweb/unix/.../doc/drweb-file-servers-500-linux-ru.pdf]ftp.drweb.com/pub/drweb/unix/.../doc/drweb-file-servers-500-linux-ru.pdf[/url] (глава 7).

Надеюсь, это то, что хотел автор =).

возможно я бы воспольльзовался данным вариантом, но уже создано 2 готовых решения задачи (читайте выше)

и к стати мой вариант следит уже не только за файлопомойкой - поэтому модуль к самбе уже не подходит

и DrWeb в данном случае не совсем простой а перенесенный с DrWeb Live CD (таким образом бесплатный)

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