1 (18.11.2010 13:41:22 отредактировано chizh)

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

Для чего нужно: 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

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

2

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

3

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

Был, был и весь вышел...

4

chizh пишет:

вижу 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) перемещаем новый список в старый

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

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

5

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 но так и не нашел нормального примера скрипта по слежению за файловой системой - может быть направите?

6

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

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

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

7

chizh пишет:

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

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

chizh пишет:

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

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

chizh пишет:

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

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

chizh пишет:

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

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

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

8

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

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

9

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 так вообще жутко тормозит

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

10 (16.11.2010 11:30:11 отредактировано drBatty)

chizh пишет:

кому интересно - могу поделиться.............

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

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

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

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

11

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

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

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

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

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

12

chizh пишет:

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


так может при этом 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. Только она у меня не поддерживается.

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

13

  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  реагирует именно на дату модификации

14

chizh пишет:

Change: 2010-11-14 15:31:09.000000000 +0300

chizh пишет:

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

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

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

15

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

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

16

chizh пишет:

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

не надо двух!

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

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

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

17 (18.11.2010 00:17:39 отредактировано chizh)

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

вобщем вот выкладываю 2 продукта 1 основан на InotifyWait другой на Find

inotifywait DrWeb
http://depositfiles.com/files/4e9fooc9a

find DrWeb
http://depositfiles.com/files/m6vvch2t7

18

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

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

19

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

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

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

20

elve пишет:

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

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

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

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

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

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

21

elve пишет:

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

Из того, что я нашел в Инете (да и по приведеной ссылке тоже) этот самый, нужный. модуль надо подключать к самбе путем её перекомпиляции из исходников. А этот путь мне как то не очень близок. Вопрос простой - можно ли обойтись без перекомпиляции? То есть есть ли возможность узнать  включен ли этот модуль в стантарный .rpm или нет?

22

Поищите нужный модуль в /usr/lib/samba. Там они лежат у меня. В вашем дистрибутиве путь может отличаться, но не сильно.