Задача: следить рекурсивно за записью/изменением в папке файлов с определенной маской расширений.
Для чего нужно: 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
пробуйте/дорабатывайте/пользуйтесь кому интересно......................
Отслеживание событий файловой системы
Inotify умеет записывать в файл изменения, grep-ом этот файл файл и переделать скрипт чтобы он работал с файлом в который записываются изменения.
вижу 3 варианта решения:
4)
#!/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) перемещаем новый список в старый
отладка - дело ваше. спрашивайте, если что...
#!/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ГБ и минимум половина в ней виндовый софт - дрова на все подряд и под все подряд, проги, игрухи - ибо моя контора занимается ремонтом компов)
и на сколько я понял этот скрипт не отслеживает переписанных файлов (вариант если вирус с ремонтируемого компа добирается до исполняемых файлов в шаре) - может быть я и не прав.........
ну и учитывая медленность этого варианта он врядли обеспечит соответствующую оперативность.....
Возможно, вам подойдёт dazuko.
Не плохой вариант - попробую если нарою по нему норм документацию - на сколько я понял этот инструмент юзают многие АВ мониторы под *nix - но восновном инфа по исправлению багов работы с антивирями и по установке - по разработке своих решений на основе Dazuko пока не нарыл
Inotify умеет записывать в файл изменения, grep-ом этот файл файл и переделать скрипт чтобы он работал с файлом в который записываются изменения.
Гдето видал что Inotify можно юзать просто - без построенных на ней incron и inotify tools но так и не нашел нормального примера скрипта по слежению за файловой системой - может быть направите?
Что делать с Inotify и Dazuko так и не разобрался, зато приручил INOTIFYWAIT
получилось 2 основных скрипта:
1) в бесконечном цыкле следит за папкой, с помощью inotifywait и записывает пути файлов, интересных для сканирования, в список
2) запускается из crontab каждую минуту и проверяет: если список пуст - ничего не делает, если не пуст запускает скан по списку
Итого получился бесплатный консольный DrWeb Scaner со сторонним файловым монитором - кому интересно - могу поделиться.............
на сколько я правильно понял этот скрипт - поиск всех файлов по всей папке подходящих по маске и сравнение с пердыдущим списком.
происходить подобный поиск будет оч долго, и список будет оч длинный (файлопомойка около 400ГБ и минимум половина в ней виндовый софт - дрова на все подряд и под все подряд, проги, игрухи - ибо моя контора занимается ремонтом компов)
неправильно. это поиск всех файлов НОВЕЕ списка. что до быстродействия - а вы проверьте, прежде чем делать такие выводы. я работаю с каталогами содержащими сотни тысяч файлов, и ничего...
зачем поменяли pdf на pif? впрочем как хотите - это ваше дело. через \| можно добавлять любое количество "расширений".
и на сколько я понял этот скрипт не отслеживает переписанных файлов (вариант если вирус с ремонтируемого компа добирается до исполняемых файлов в шаре) - может быть я и не прав.........
Не правы. -newer file ищет все файлы, дата модификации которых больше даты файла.
ну и учитывая медленность этого варианта он врядли обеспечит соответствующую оперативность.....
ага. а я - идиот. тесты в студию! обычно такая find БЫСТРЕЕ чем все остальные решения.
Итого получился бесплатный консольный DrWeb Scaner со сторонним файловым монитором - кому интересно - могу поделиться.............
для начала сравните быстродействие с моим скриптом.
Появилось время - затестил скрипт с поиском всех файлов новее списка:
производительность действительно шикарная перечисляет папку за несколько секунд
Но есть недостаток:
не реагирует на свеже скопированные и свеже переименованные файлы (то есть если я изменяю файл позже списка, или создаю - скрипт его ловит, а если просто копирую или переименовываю файл который был создан и изменен хз когда - 0 эммоций)
inotifywait с реакцией на close_write + moved_to ловит все скопированные, записанные, перезаписанные, перемещенные, и переименованные файлы
производительность действительно шикарная перечисляет папку за несколько секунд
это много или мало?
не реагирует на свеже скопированные и свеже переименованные файлы (то есть если я изменяю файл позже списка, или создаю - скрипт его ловит, а если просто копирую или переименовываю файл который был создан и изменен хз когда - 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 так вообще жутко тормозит
кому интересно - могу поделиться.............
дык выкладывайте прямо здесь.
PS: я тут подумал, может будет быстрее, если убрать тест -regex ...
и проверять имена вот так:
find \( -iname "*.exe" -o -iname "*.pif" -o -iname "*.что-то-там-ещё" \)
попробуйте поиграться с созданием новой ФС (это по вендоваму "форматирование"), в mkfs.ext4 множество опций для этого. Это если время есть. Насколько я знаю, никто таких тестов не производил. Все форматируют "абы как захотелось маинтейнеру"... А маинтейнеры ставят опции "для всех", потому в таких случаях они не оптимальны. Например, непонятно, зачем в файлопомойке 5% резерва. Жалко. А резерв не нужен, всё равно руту туда нельзя. Резерв нужен на корне, на /var (и то - не для всех), может быть на /tmp. Файлопомойки удобнее всего делать в /home, а тудда заходят лишь пользователи (ну так должно-быть, ИМХО)
Файловой системе несколько дней (до этого на серваке стояла вин серв 2003 - сменил винт и поставил ubuntu - ибо более или менее на эксперементальной машине довел конфиги всех сервисов до нормального функционирования)
так что данные все были скопированы с другого винта (NTFS) на текущий (ReiserFS)
раздел под файлопомойку отдельный и смонтирован в отдельную точку монтирования (не входит в стандартные папки корневой системы)
в /home не вижу смысла потому что сервером как таковым никто не пользуется и единственный пользователь нужен только для ssh входа, у сервака даже монитора клавы и мыши нет))))
З. Ы. не наблюдаю прямой связи между созданием новой файловой системы и датами создания файлов, потому что когда с другого компа файл попадает в файлопомойку средствами самбы, и при этом имеет дату изменения "давным давно" (на исходном компе), скрипт его не находит - по вполне видимым причинам
не наблюдаю прямой связи между созданием новой файловой системы и датами создания файлов, потому что когда с другого компа файл попадает в файлопомойку средствами самбы, и при этом имеет дату изменения "давным давно" (на исходном компе), скрипт его не находит - по вполне видимым причинам
так может при этом ctime файла изменяется? ИМХО - должна.
у меня меняется (и дата модификации и дата смены статуса)
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. Только она у меня не поддерживается.
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 реагирует именно на дату модификации
Change: 2010-11-14 15:31:09.000000000 +0300
и все файлы так копируются при чом newer file реагирует именно на дату модификации
ну смените на -newer на -cnewer, раз у вас почему-то такая беда.
попробую сделать с 2 финдами - чтоб наверняка
как опробую скажу что получилось
попробую сделать с 2 финдами - чтоб наверняка
не надо двух!
find \( -newer file -o -cnewer file \) ....как раз для этого. -o значит ИЛИ, и в скобках, т.к. приоритет -o меньше -and (-and не пишется, но оно есть)
скобки в слешах, потому-что иначе они не дойдут до find, а обработаются оболочкой
чтот не получилось у мну с 1 финдом - сделал всетаки с 2мя
вобщем вот выкладываю 2 продукта 1 основан на InotifyWait другой на Find
inotifywait DrWeb
http://depositfiles.com/files/4e9fooc9a
find DrWeb
http://depositfiles.com/files/m6vvch2t7
спасибо конечно, но 50 метров мне не скачать :(
Исходя из того, что было описано в первом посте, я заключил, что никаких 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).
Надеюсь, это то, что хотел автор =).
Исходя из того, что было описано в первом посте, я заключил, что никаких 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 (таким образом бесплатный)