Обнаружение файлов и запрос их наличия, размера, даты изменения Шаблон + LLD скрипт

Шаблоны заббикс мониторинг связанный с файлами и директориями
Аватара пользователя
Артём Мамзиков
Admin
Сообщения: 857
Стаж: 5 лет 8 месяцев
Откуда: Вологодская область
Поблагодарили: 37 раз
Контактная информация:

Обнаружение файлов и запрос их наличия, размера, даты изменения Шаблон + LLD скрипт

Сообщение Артём Мамзиков »

Аналог с доработками шаблона Обнаружение папок и запрос их размера LLD Шаблон + Скрипт только для файлов.

LLD - Обнаружение файлов и их мониторинг Linux и Windows

Проверяются следующие параметры:
1.Наличие файла
2.Размер файла
3.Время изменения файла
4.Время изменения свойств файла
5.Время последнего доступа
Можно дополнить своими проверками.

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

Более подробно:
Может ли проверять на одном узле несколько каталогов с файлами? Да может.
Указываем макросе {$PUTFILE} узла пути через точку с запятой завершающий слеш не нужен
Пример для Windows:
{$PUTFILE} C:\zabbix;C:\Users
Для сети вначале проставить 3 слеша
\\\192.168.ххх.ххх\папка
Пример для Linux:
{$PUTFILE} /root;/home/user

Могу ли я задать порт для подключения? Да.
Указываем в макросе Узла
{$HOST.PORTS} порт по умолчанию в шаблоне указан 10050
Так же есть активный порт, для отправки trappetom и ошибок.
{$HOST.PORTSACTIV} порт по умолчанию в шаблоне указан 10051

Можно ли скрыть или отобразить конкретные файлы ? Да можно.
Для этого можно воспользоваться фильтром в правиле обнаружения или макросами в узле.
{$FILTRFILE} по умолчанию в шаблоне задано отображать все .*
{$HIDEFILE} по умолчанию в шаблоне задано отображать все ^$
Для указания нескольких файлов (перечисления) вид следующий
Файл1\|Файл2\|Файл3 и так далее
* учитывать пробел если он есть иначе короткое слово может попасть под регулярку!
Так же данные фильтра используется в trapper.
Можно использовать фильтра заббикс в правиле обнаружения, тогда они будут работать только для обнаружения, а способ trapper будет запрашивать данные и отправлять данные для всего что найдет просто в никуда для тех элементов которых не будет в заббикс.

Что делать если за время timeout 15-30 секунд не успевает прилететь ответ? На это случае есть дополнительные правила и скрипты работающие через trapper.
Макрос для указания пути где лежит скрипт trapper.
{$SCRIPT.TRAPFILE}
Пример Windows:
C:\zabbix\Scripts\dir-file-trapper-win-cp866-File.bat
Пример Linux:
/etc/zabbix/scripts/dir-file-trappet.sh

Для Windows скриптов trapper есть макрос для указания текущей кодировки узла
{$KODR} по умолчанию в шаблоне указана cp866 (не используется на данный момент)
Так же в скриптах trappet указать IP в переменой IPZBXSERVER=192.168.XXX.XXX

Есть какие то ограничения?
Для Windows trapper (не путать trapper Лог там все ок) где запросы напрямую отправляются с батника для каждого элемента в заббикс не поддерживается русский язык так как не перекодируется в utf-8.
Так же если имя файла начинается на &36.txt то на windows при работе скрипта когда строка не экранирована это вызывает ошибку.
Еще касаемо имен файлов и папок
Показать
vfs.file.time["/root/test/?34.txt",change] - Cannot obtain file information: [2] No such file or directory
vfs.file.time["/root/test/???? ???????.txt",change] - Cannot obtain file information: [2] No such file or directory
"/home/user/ls: невозможно получить доступ к '/home/user': Нет такого файла или каталога"
34 траппер ошибка
34 работает виде лога траппер

Обычный траппер ошибки
["D:\test\!32.txt"]
["D:\test\№34.txt"]
["D:\test\^35.txt"]

Траппер Лог ошибки
["D:\test\^35.txt"] ошибка на регулярку
["D:\test\!32.txt"] ошибка на регулярку
["D:\test\Тест русский.txt"]

Не работают кривые имена с windows
Преобразует не правильно проверка не проходит
Оригинал
РЎРїРёСЃРєРё РњРќРЎ.xls
Стало
РЎРїРёС?РєРё Р?Р?РЎ.xls
Если файл начинается на ' (одинарную кавычку он скроется из вывода) для windows работающий через скрипт trappet, так как данная кавычка указана как полмолчания ничего не скрывать можно заменить на другой символ.
Дата через trappet приходит в обычном формате как текст, для некоторых функций триггера нужно ее перевести в unixtime. (возможно реализую позже)
Файлы с датой в имени, не совсем подходят сюда так как
Сделать авто обнаружение файла так же не вариант так как:
Файл будет каждый день новый сравнить размер не получится, после удаления предыдущих файлов сработает триггер на старые файлы что нет данных, можно конечно выставить удаление через 0 дней если не обнаруживается сразу удалился, если файла нет то и проверка не создастся и мы ничего не узнаем.
Для этого у нас есть другой шаблон Шаблон проверки файлов
Другие нюансы по факту их обнаружения.
Как работает
Показать
Цепляем шаблон "Обнаружение файлов и запрос их размера" к Узлу
В узле указываем макросы
{$PUTFILE} тут указываем путь или пути через точку с запятой где сканировать наличие файлов
Например:
/home/user;/root/bak - находим файлы в 2х папках
C:\zabbix;C:\Users - находим файлы в 2х папках
Завершающий слеш в конце пути не нужен, так же должен быть доступ на проверяемую папку.

При необходимости задаем свой порт
{$HOST.PORTS} по умолчанию 10050

{$HOST.PORTSACTIV} порт по умолчанию в шаблоне указан 10051

Можно задать конкретные имена файлов которые нам необходимы
{$FILTRFILE} по умолчанию все .* несколько файлов: Имя файла1\|Имя файла2\|имя файла3
Можно наоборот скрыть из вывода не нужные файлы
{$HIDEFILE} по умолчанию все показывать все ^$ аналогично несколько файлов: Имя файла1\|Имя файла2\|имя файла3
Аналогично настройки Фильтра в правиле обнаружения можно пользоваться стандартным фильтром

Кодировка задается для Windows Русских названий файлов и дальнейшая перекодировка в UTF-8
{$KODR} по умолчанию cp866 при не об ходимости в узле задайте 1251

Макрос для указания пути где лежит скрипт trapper.
{$SCRIPT.TRAPFILE}
Пример Windows:
C:\zabbix\Scripts\dir-file-trapper-win-cp866-File.bat
Пример Linux:
/etc/zabbix/scripts/dir-file-trappet.sh

Далее все данные поступаю в скрипт size-file.sh при обнаружении файлов.
СКАЧАТЬ
Обнаружение файлов и запрос их размера.zip
Обнаружение файлов и запрос их размера.zip
(38.87 КБ) 197 скачиваний
Windows для большого кол-ва файлов скрипт 6.2
Обнаружение файлов и запрос их размера dop.zip
Обнаружение файлов и запрос их размера dop.zip
(62.15 КБ) 122 скачивания
Установка делаем импорт шаблона на заббикс сервер, копируем скрипт size-file.sh на заббикс сервер в моем случае путь такой
/usr/local/share/zabbix/externalscripts/
Цепляем шаблон к узлу, указываем необходимые макросы в узле и активируем нужное правило обнаружения.
Обнаружение файлов и запрос их размера
Обнаружение файлов и запрос их размера
Команды проверки и тестирования
Показать
Скрипт обнаружения работает на командах, должен быть доступ заббикс агенту от имени которого он запущен до данных каталогов.

Вывод Обнаружение файлов в указанной папке
ls -aF путь до файлов и исключить из вывода каталоги |grep -av "/"
dir /a-d /B \ путь до файлов

Проверка со стороны заббикс сервера
Linux
zabbix_get -s 192.168.XXX.XXX -p 10050 -k system.run["ls -aF "путь до файлов"|grep -av "/""]
Windows
zabbix_get -s 192.168.XXX.XXX -p 10050 -k system.run["dir /a-d /B \""путь до файлов"\""]

Команда Ключ Linux
size-file.sh[{HOST.CONN},{$HOST.PORTS},discovery,{$PUTFILE},{$FILTRFILE},{$HIDEFILE},{$KODR},{HOST.HOST},{$HOST.PORTSACTIV}]
/usr/local/share/zabbix/externalscripts/size-file.sh 192.168.xxx.xxx 10050 discovery "/home/user;/root/test" ".*" "^$" "" "HOSTNAME" "10051"
Пример полученного ответа
Показать
[
{"{#FILESIZELINUX}":"/root/test/-27.txt", "{#NAMEFILELINUX}":"-27.txt"},
{"{#FILESIZELINUX}":"/root/test/.28.txt", "{#NAMEFILELINUX}":".28.txt"},
{"{#FILESIZELINUX}":"/root/test/,29.txt", "{#NAMEFILELINUX}":",29.txt"},
{"{#FILESIZELINUX}":"/root/test/$30.txt", "{#NAMEFILELINUX}":"$30.txt"},
{"{#FILESIZELINUX}":"/root/test/@31.txt", "{#NAMEFILELINUX}":"@31.txt"},
{"{#FILESIZELINUX}":"/root/test/!32.txt", "{#NAMEFILELINUX}":"!32.txt"},
{"{#FILESIZELINUX}":"/root/test/#33.txt", "{#NAMEFILELINUX}":"#33.txt"},
{"{#FILESIZELINUX}":"/root/test/-34.txt", "{#NAMEFILELINUX}":"-34.txt"},
{"{#FILESIZELINUX}":"/root/test/^35.txt", "{#NAMEFILELINUX}":"^35.txt"},
{"{#FILESIZELINUX}":"/root/test/(37.txt", "{#NAMEFILELINUX}":"(37.txt"},
{"{#FILESIZELINUX}":"/root/test/)38.txt", "{#NAMEFILELINUX}":")38.txt"},
{"{#FILESIZELINUX}":"/root/test/-39.txt", "{#NAMEFILELINUX}":"-39.txt"},
{"{#FILESIZELINUX}":"/root/test/_40.txt", "{#NAMEFILELINUX}":"_40.txt"},
{"{#FILESIZELINUX}":"/root/test/+41.txt", "{#NAMEFILELINUX}":"+41.txt"},
{"{#FILESIZELINUX}":"/root/test/{42.txt", "{#NAMEFILELINUX}":"{42.txt"},
{"{#FILESIZELINUX}":"/root/test/[43.txt", "{#NAMEFILELINUX}":"[43.txt"},
{"{#FILESIZELINUX}":"/root/test/a1.txt", "{#NAMEFILELINUX}":"a1.txt"},
{"{#FILESIZELINUX}":"/root/test/b2.txt", "{#NAMEFILELINUX}":"b2.txt"},
{"{#FILESIZELINUX}":"/root/test/c3.txt", "{#NAMEFILELINUX}":"c3.txt"},
{"{#FILESIZELINUX}":"/root/test/d4.txt", "{#NAMEFILELINUX}":"d4.txt"},
{"{#FILESIZELINUX}":"/root/test/e5.txt", "{#NAMEFILELINUX}":"e5.txt"},
{"{#FILESIZELINUX}":"/root/test/f6.txt", "{#NAMEFILELINUX}":"f6.txt"},
{"{#FILESIZELINUX}":"/root/test/g7.txt", "{#NAMEFILELINUX}":"g7.txt"},
{"{#FILESIZELINUX}":"/root/test/h8.txt", "{#NAMEFILELINUX}":"h8.txt"},
{"{#FILESIZELINUX}":"/root/test/i9.txt", "{#NAMEFILELINUX}":"i9.txt"},
{"{#FILESIZELINUX}":"/root/test/j10.txt", "{#NAMEFILELINUX}":"j10.txt"},
{"{#FILESIZELINUX}":"/root/test/k11.txt", "{#NAMEFILELINUX}":"k11.txt"},
{"{#FILESIZELINUX}":"/root/test/l12.txt", "{#NAMEFILELINUX}":"l12.txt"},
{"{#FILESIZELINUX}":"/root/test/m13.txt", "{#NAMEFILELINUX}":"m13.txt"},
{"{#FILESIZELINUX}":"/root/test/n14.txt", "{#NAMEFILELINUX}":"n14.txt"},
{"{#FILESIZELINUX}":"/root/test/o15.txt", "{#NAMEFILELINUX}":"o15.txt"},
{"{#FILESIZELINUX}":"/root/test/p16.txt", "{#NAMEFILELINUX}":"p16.txt"},
{"{#FILESIZELINUX}":"/root/test/pro bel d", "{#NAMEFILELINUX}":"pro bel d"},
{"{#FILESIZELINUX}":"/root/test/q17.txt", "{#NAMEFILELINUX}":"q17.txt"},
{"{#FILESIZELINUX}":"/root/test/r18.txt", "{#NAMEFILELINUX}":"r18.txt"},
{"{#FILESIZELINUX}":"/root/test/s19.txt", "{#NAMEFILELINUX}":"s19.txt"},
{"{#FILESIZELINUX}":"/root/test/t20.txt", "{#NAMEFILELINUX}":"t20.txt"},
{"{#FILESIZELINUX}":"/root/test/---- -------.txt", "{#NAMEFILELINUX}":"---- -------.txt"},
{"{#FILESIZELINUX}":"/root/test/u21.txt", "{#NAMEFILELINUX}":"u21.txt"},
{"{#FILESIZELINUX}":"/root/test/v22.txt", "{#NAMEFILELINUX}":"v22.txt"},
{"{#FILESIZELINUX}":"/root/test/w23.txt", "{#NAMEFILELINUX}":"w23.txt"},
{"{#FILESIZELINUX}":"/root/test/x24.txt", "{#NAMEFILELINUX}":"x24.txt"},
{"{#FILESIZELINUX}":"/root/test/y25.txt", "{#NAMEFILELINUX}":"y25.txt"},
{"{#FILESIZELINUX}":"/root/test/z26.txt", "{#NAMEFILELINUX}":"z26.txt"}
]

---- ------- тут было слово на русском написанное на Windows b скопировано в Linux
После создают Элементы данных
{#NAMEFILELINUX} - Имя файла
Время изменения свойств файла {#FILESIZELINUX} vfs.file.time[{#FILESIZELINUX},change]
Время изменения файла {#FILESIZELINUX} vfs.file.time[{#FILESIZELINUX},modify]
Время последнего доступа {#FILESIZELINUX} vfs.file.time[{#FILESIZELINUX},access]
Наличие файла {#FILESIZELINUX} vfs.file.exists[{#FILESIZELINUX}]
Размер файла {#FILESIZELINUX} vfs.file.size[{#FILESIZELINUX}]


Команда Ключ Windows
size-file.sh[{HOST.CONN},{$HOST.PORTS},discoverywin,{$PUTFILE},{$FILTRFILE},{$HIDEFILE},{$KODR},{HOST.HOST},{$HOST.PORTSACTIV}]
/usr/local/share/zabbix/externalscripts/size-file.sh 192.168.xxx.xxx 10050 discoverywin "C:\Users\Public;D:\test" ".*" "^$" "cp866" "HOSTNAME" "10051"
Пример полученного ответа
Показать
[
{"{#FILESIZEWIN}":"C:\\Users\\Public\\desktop.ini", "{#NAMEFILEWIN}":"desktop.ini"},
{"{#FILESIZEWIN}":"D:\\test\\!32.txt", "{#NAMEFILEWIN}":"!32.txt"},
{"{#FILESIZEWIN}":"D:\\test\\#33.txt", "{#NAMEFILEWIN}":"#33.txt"},
{"{#FILESIZEWIN}":"D:\\test\\$30.txt", "{#NAMEFILEWIN}":"$30.txt"},
{"{#FILESIZEWIN}":"D:\\test\\(37.txt", "{#NAMEFILEWIN}":"(37.txt"},
{"{#FILESIZEWIN}":"D:\\test\\)38.txt", "{#NAMEFILEWIN}":")38.txt"},
{"{#FILESIZEWIN}":"D:\\test\\+41.txt", "{#NAMEFILEWIN}":"+41.txt"},
{"{#FILESIZEWIN}":"D:\\test\\,29.txt", "{#NAMEFILEWIN}":",29.txt"},
{"{#FILESIZEWIN}":"D:\\test\\-27.txt", "{#NAMEFILEWIN}":"-27.txt"},
{"{#FILESIZEWIN}":"D:\\test\\-39.txt", "{#NAMEFILEWIN}":"-39.txt"},
{"{#FILESIZEWIN}":"D:\\test\\.28.txt", "{#NAMEFILEWIN}":".28.txt"},
{"{#FILESIZEWIN}":"D:\\test\\@31.txt", "{#NAMEFILEWIN}":"@31.txt"},
{"{#FILESIZEWIN}":"D:\\test\\a1.txt", "{#NAMEFILEWIN}":"a1.txt"},
{"{#FILESIZEWIN}":"D:\\test\\b2.txt", "{#NAMEFILEWIN}":"b2.txt"},
{"{#FILESIZEWIN}":"D:\\test\\c3.txt", "{#NAMEFILEWIN}":"c3.txt"},
{"{#FILESIZEWIN}":"D:\\test\\d4.txt", "{#NAMEFILEWIN}":"d4.txt"},
{"{#FILESIZEWIN}":"D:\\test\\e5.txt", "{#NAMEFILEWIN}":"e5.txt"},
{"{#FILESIZEWIN}":"D:\\test\\f6.txt", "{#NAMEFILEWIN}":"f6.txt"},
{"{#FILESIZEWIN}":"D:\\test\\g7.txt", "{#NAMEFILEWIN}":"g7.txt"},
{"{#FILESIZEWIN}":"D:\\test\\h8.txt", "{#NAMEFILEWIN}":"h8.txt"},
{"{#FILESIZEWIN}":"D:\\test\\i9.txt", "{#NAMEFILEWIN}":"i9.txt"},
{"{#FILESIZEWIN}":"D:\\test\\j10.txt", "{#NAMEFILEWIN}":"j10.txt"},
{"{#FILESIZEWIN}":"D:\\test\\k11.txt", "{#NAMEFILEWIN}":"k11.txt"},
{"{#FILESIZEWIN}":"D:\\test\\l12.txt", "{#NAMEFILEWIN}":"l12.txt"},
{"{#FILESIZEWIN}":"D:\\test\\m13.txt", "{#NAMEFILEWIN}":"m13.txt"},
{"{#FILESIZEWIN}":"D:\\test\\n14.txt", "{#NAMEFILEWIN}":"n14.txt"},
{"{#FILESIZEWIN}":"D:\\test\\o15.txt", "{#NAMEFILEWIN}":"o15.txt"},
{"{#FILESIZEWIN}":"D:\\test\\p16.txt", "{#NAMEFILEWIN}":"p16.txt"},
{"{#FILESIZEWIN}":"D:\\test\\pro bel d.txt", "{#NAMEFILEWIN}":"pro bel d.txt"},
{"{#FILESIZEWIN}":"D:\\test\\q17.txt", "{#NAMEFILEWIN}":"q17.txt"},
{"{#FILESIZEWIN}":"D:\\test\\r18.txt", "{#NAMEFILEWIN}":"r18.txt"},
{"{#FILESIZEWIN}":"D:\\test\\s19.txt", "{#NAMEFILEWIN}":"s19.txt"},
{"{#FILESIZEWIN}":"D:\\test\\t20.txt", "{#NAMEFILEWIN}":"t20.txt"},
{"{#FILESIZEWIN}":"D:\\test\\u21.txt", "{#NAMEFILEWIN}":"u21.txt"},
{"{#FILESIZEWIN}":"D:\\test\\v22.txt", "{#NAMEFILEWIN}":"v22.txt"},
{"{#FILESIZEWIN}":"D:\\test\\w23.txt", "{#NAMEFILEWIN}":"w23.txt"},
{"{#FILESIZEWIN}":"D:\\test\\x24.txt", "{#NAMEFILEWIN}":"x24.txt"},
{"{#FILESIZEWIN}":"D:\\test\\y25.txt", "{#NAMEFILEWIN}":"y25.txt"},
{"{#FILESIZEWIN}":"D:\\test\\z26.txt", "{#NAMEFILEWIN}":"z26.txt"},
{"{#FILESIZEWIN}":"D:\\test\\[43.txt", "{#NAMEFILEWIN}":"[43.txt"},
{"{#FILESIZEWIN}":"D:\\test\\^35.txt", "{#NAMEFILEWIN}":"^35.txt"},
{"{#FILESIZEWIN}":"D:\\test\\_40.txt", "{#NAMEFILEWIN}":"_40.txt"},
{"{#FILESIZEWIN}":"D:\\test\\{42.txt", "{#NAMEFILEWIN}":"{42.txt"},
{"{#FILESIZEWIN}":"D:\\test\\Тест русский.txt", "{#NAMEFILEWIN}":"Тест русский.txt"},
{"{#FILESIZEWIN}":"D:\\test\\№34.txt", "{#NAMEFILEWIN}":"№34.txt"}
]
Что бы оставить правильные слеши и не разворачивать их в lld нужно передавать в 2 раза больше их чем нужно нам если нам нужен \ то передаем \\

После создают Элементы данных
{#NAMEFILEWIN} - Имя файла
Время изменения свойств файла {#FILESIZEWIN} vfs.file.time[{#FILESIZEWIN},change]
Время изменения файла {#FILESIZEWIN} vfs.file.time[{#FILESIZEWIN},modify]
Время последнего доступа {#FILESIZEWIN} vfs.file.time[{#FILESIZEWIN},access]
Наличие файла {#FILESIZEWIN} vfs.file.exists[{#FILESIZEWIN}]
Размер файла {#FILESIZEWIN} vfs.file.size[{#FILESIZEWIN}]


Далее у нас идут команды для zabbix trapper
Скрипт для Linux dir-file-trappet.sh
ls -aF путь до файлов|grep -av "/" - отобразить содержимое кроме папок
du -sb --time путь до файлов - размера в байтах и даты изменения разбор по столбцам
du -sb --time=ctime путь до файлов| awk '{print $2, $3}' -Время изменения свойств файла в формате ГГГГ.ММ.ДД ЧЧ:ММ
du -sb --time=atime путь до файлов| awk '{print $2, $3}' -Время последнего доступа в формате ГГГГ.ММ.ДД ЧЧ:ММ

Локальная проверка
/etc/zabbix/scripts/dir-file-trappet.sh "ИмяХоста" "10051" "/путь" ".*" "^$"

Запуск удаленного скрипта обнаружение файлов, через заббикс агент Linux
system.run['{$SCRIPT.TRAPFILE}' "{HOST.HOST}" "{$HOST.PORTSACTIV}" "{$PUTFILE}" "{$FILTRFILE}" "{$HIDEFILE}",nowait]
zabbix_get -s 192.168.XXX.XXX -k system.run[''/etc/zabbix/scripts/dir-file-trappet.sh' 'ИмяХоста' '10051' '/путь' '.*' '^$'',nowait]
zabbix_get -s 192.168.XXX.XXX -k system.run[''/etc/zabbix/scripts/dir-file-trappet.sh' "ИмяХоста" "10051" "/путь" ".*" "^$"']
zabbix_get -s 192.168.XXX.XXX -k system.run[''/etc/zabbix/scripts/dir-file-trappet.sh' "ИмяХоста" "10051" "/путь" ".*" "^$"',nowait]
zabbix_get -s 192.168.XXX.XXX -k system.run["'/etc/zabbix/scripts/dir-file-trappet.sh' 'ИмяХоста' '10051' '/путь' '.*' '^$'",nowait]
Другие варианты
Показать
zabbix_get -s 192.168.XXX.XXX -k system.run[''/etc/zabbix/scripts/dir-file-trappet.sh' 'agentzabbixserver' '10051' '/root' '.*' '^$'']
/etc/zabbix/scripts/dir-file-trappet.sh: 24: /etc/zabbix/scripts/dir-file-trappet.sh: Syntax error: redirection unexpected
Ошибка так как в скрипте сместилась первая строка #!/bin/bash , первая была пустая вторя содержала #!/bin/bash
Запускается через sh изначально с команды system.run

zabbix_get -s 192.168.XXX.XXX -k system.run[''/etc/zabbix/scripts/dir-file-trappet.sh' "agentzabbixserver" "10051" "/root" ".*" "^$"']
zabbix_get -s 192.168.XXX.XXX -k system.run[''/etc/zabbix/scripts/dir-file-trappet.sh' 'agentzabbixserver' '10051' '/root' '.*' '^$'']
zabbix_get -s 192.168.XXX.XXX -k system.run['"/etc/zabbix/scripts/dir-file-trappet.sh" 'agentzabbixserver' '10051' '/root' '.*' '^$'']
ZBX_NOTSUPPORTED: Invalid item key format.
zabbix_get -s 192.168.XXX.XXX -k system.run['$("/etc/zabbix/scripts/dir-file-trappet.sh" "agentzabbixserver" "10051" "/root" ".*" "^$"),nowait']
1
zabbix_get -s 192.168.XXX.XXX -k system.run['$("/etc/zabbix/scripts/dir-file-trappet.sh" "agentzabbixserver" "10051" "/root" ".*" "^$"),nowait']
1
zabbix_get -s 192.168.XXX.XXX -k system.run['$("/etc/zabbix/scripts/dir-file-trappet.sh" "agentzabbixserver" "10051" "/root" ".*" "^$"),nowait']
1
zabbix_get -s 192.168.XXX.XXX -k system.run['`"/etc/zabbix/scripts/dir-file-trappet.sh" "agentzabbixserver" "10051" "/root" ".*" "^$"`,nowait']
1
zabbix_get -s 192.168.XXX.XXX -k system.run['`"/etc/zabbix/scripts/dir-file-trappet.sh" "agentzabbixserver" "10051" "/root" ".*" "^$"`',nowait]
1
zabbix_get -s 192.168.XXX.XXX -k system.run[`"/etc/zabbix/scripts/dir-file-trappet.sh" "agentzabbixserver" "10051" "/root" ".*" "^$"`,nowai
zabbix_get -s 192.168.XXX.XXX -k system.run['$("/etc/zabbix/scripts/dir-file-trappet.sh" "agentzabbixserver" "10051" "/root" ".*" "^$"),nowait']
1
zabbix_get -s 192.168.XXX.XXX -k system.run['$("/etc/zabbix/scripts/dir-file-trappet.sh" "agentzabbixserver" "10051" "/root" ".*" "^$")']
/etc/zabbix/scripts/dir-file-trappet.sh: 24: /etc/zabbix/scripts/dir-file-trappet.sh: Syntax error: redirection unexpected

zabbix_get -s 192.168.XXX.XXX -k system.run['$("/etc/zabbix/scripts/dir-file-trappet.sh" "agentzabbixserver" "10051" "/root" ".*" "^$")']
/etc/zabbix/scripts/dir-file-trappet.sh: 24: /etc/zabbix/scripts/dir-file-trappet.sh: Syntax error: redirection unexpected

zabbix_get -s 192.168.XXX.XXX -k system.run['$(/etc/zabbix/scripts/dir-file-trappet.sh "agentzabbixserver" "10051" "/root" ".*" "^$")']
/etc/zabbix/scripts/dir-file-trappet.sh: 24: /etc/zabbix/scripts/dir-file-trappet.sh: Syntax error: redirection unexpected

zabbix_get -s 192.168.XXX.XXX -k system.run['$(/etc/zabbix/scripts/dir-file-trappet.sh "'agentzabbixserver'" "'10051'" "'/root'" "'.*'" "'^$'")']
/etc/zabbix/scripts/dir-file-trappet.sh: 24: /etc/zabbix/scripts/dir-file-trappet.sh: Syntax error: redirection unexpected

zabbix_get -s 192.168.XXX.XXX -k system.run['$(/etc/zabbix/scripts/dir-file-trappet.sh '"agentzabbixserver"' '"10051"' '"/root"')']
/etc/zabbix/scripts/dir-file-trappet.sh: 24: /etc/zabbix/scripts/dir-file-trappet.sh: Syntax error: redirection unexpected

zabbix_get -s 192.168.XXX.XXX -k system.run['$(/etc/zabbix/scripts/dir-file-trappet.sh 'agentzabbixserver' '10051' '/root')']
/etc/zabbix/scripts/dir-file-trappet.sh: 24: /etc/zabbix/scripts/dir-file-trappet.sh: Syntax error: redirection unexpected

zabbix_get -s 192.168.XXX.XXX -k system.run['$('/etc/zabbix/scripts/dir-file-trappet.sh' 'agentzabbixserver' '10051' '/root')']
/etc/zabbix/scripts/dir-file-trappet.sh: 24: /etc/zabbix/scripts/dir-file-trappet.sh: Syntax error: redirection unexpected

zabbix_get -s 192.168.XXX.XXX -k system.run['/etc/zabbix/scripts/dir-file-trappet.sh' 'agentzabbixserver' '10051' '/root']
zabbix_get [12244]: invalid parameter "agentzabbixserver"
zabbix_get [12244]: invalid parameter "10051"
zabbix_get [12244]: invalid parameter "/etc]"
Try 'zabbix_get --help' for more information.

zabbix_get -s 192.168.XXX.XXX -k system.run[/etc/zabbix/scripts/dir-file-trappet.sh 'agentzabbixserver' '10051' '/root']
zabbix_get [12540]: invalid parameter "agentzabbixserver"
zabbix_get [12540]: invalid parameter "10051"
zabbix_get [12540]: invalid parameter "/etc]"
Try 'zabbix_get --help' for more information.

zabbix_get -s 192.168.XXX.XXX -k system.run[/etc/zabbix/scripts/dir-file-trappet.sh "agentzabbixserver" "10051" "/root"]
zabbix_get [13012]: invalid parameter "agentzabbixserver"
zabbix_get [13012]: invalid parameter "10051"
zabbix_get [13012]: invalid parameter "/etc]"
Try 'zabbix_get --help' for more information.

zabbix_get -s 192.168.XXX.XXX -k system.run[''/etc/zabbix/scripts/dir-file-trappet.sh' 'agentzabbixserver' '10051' '/root'']
/etc/zabbix/scripts/dir-file-trappet.sh: 24: /etc/zabbix/scripts/dir-file-trappet.sh: Syntax error: redirection unexpected

zabbix_get -s 192.168.XXX.XXX -k system.run[''/etc/zabbix/scripts/dir-file-trappet.sh' 'agentzabbixserver' '10051' '/root' '.*' '^$'']
/etc/zabbix/scripts/dir-file-trappet.sh: 24: /etc/zabbix/scripts/dir-file-trappet.sh: Syntax error: redirection unexpected
Ошибка так как в скрипте сместилась первая строка #!/bin/bash , первая была пустая вторя содержала #!/bin/bash
Запускается через sh изначально с команды system.run

zabbix_get -s 192.168.XXX.XXX -k system.run[''/etc/zabbix/scripts/dir-file-trappet.sh' "agentzabbixserver" "10051" "/root" ".*" "^$"']
Response from "192.168.XXX.XXX:10051": "processed: 1; failed: 0; total: 1; seconds spent: 0.000141"
sent: 1; skipped: 0; total: 1

zabbix_get -s 192.168.XXX.XXX -k system.run[''/etc/zabbix/scripts/dir-file-trappet.sh' "agentzabbixserver" "10051" "/root" ".*" "^$"',nowait]
1
Запуск удаленного скрипта обнаружение файлов, через основной Linux
size-file.sh[{HOST.CONN},{$HOST.PORTS},runscript,'{$SCRIPT.TRAPFILE}',"'{HOST.HOST}'","'{$HOST.PORTSACTIV}'","'{$PUTFILE}'","'{$FILTRFILE}'","'{$HIDEFILE}'"]
/size-file.sh 192.168.XXX.XXX 10050 runscript "'/etc/zabbix/scripts/dir-file-trappet.sh'" "'ИмяХоста'" "'10051'" "'/путь'" "'.*'" "'^$'"



Запрос через скрипт Windows
C:\zabbix\Scripts\dir-file-trapper-win-cp866-File.bat "ИмяХоста" "10051" "D:\test" "26.txt" "^$" "cp866"
C:\zabbix\Scripts\dir-file-trapper-win-cp866-File.bat "ИмяХоста" "10051" "D:\test" "26.txt" "^$" "cp866"
C:\zabbix\Scripts\dir-file-trapper-win-cp866-File.bat "ИмяХоста" 10051 "C:\Users\Public;D:\test" ".*" "^$" "cp866"

Запуск удаленного скрипта обнаружение файлов, через заббикс агент Windows
system.run[{$SCRIPT.TRAPFILE} "{HOST.HOST}" "{$HOST.PORTSACTIV}" "{$PUTFILE}" "{$FILTRFILE}" "{$HIDEFILE}" "{$KODR}",nowait]
zabbix_get -s 192.168.XXX.XXX -p 10050 -k system.run['C:\zabbix\Scripts\dir-size-trapper-win-cp866-File.bat "ИмяХоста" "10051" "C:\Users\Public;D:\test" ".*" "^$" "cp866",nowait']
zabbix_get -s 192.168.XXX.XXX -p 10050 -k system.run'[C:\zabbix\Scripts\dir-size-trapper-win-cp866-File.bat "ИмяХоста" "10051" "C:\Users\Public;D:\test" ".*" "^$" "cp866",nowait]'
zabbix_get -s 192.168.XXX.XXX -p 10050 -k system.run['C:\zabbix\Scripts\dir-size-trapper-win-cp866-File.bat "ИмяХоста" "10051" "C:\Users\Public;D:\test" ".*" "^$" "cp866"',nowait]

Вид команды прилетает в лог заббикс агента:
'C:\zabbix\Scripts\dir-size-trapper-win-cp866-File.bat "ИмяХоста" "10051" "C:\Users\Public;D:\test" ".*" "^$" "cp866"'
выполняется уже без одинарных кавычек, первое значение путь до скрипта нельзя включить в кавычки не будет запускаться, если только прописать первую команду на запуск скрипта!

Ошибка:
zabbix_get -s 192.168.ХХХ.ХХХ -p 10050 -k system.run'["C:\zabbix\Scripts\dir-size-trapper-win-cp866-File.bat" "ИмяХоста" "10051" "C:\Users\Public;D:\test" ".*" "^$" "cp866",nowait]'
ZBX_NOTSUPPORTED: Invalid item key format.

Linux экранирование идет сперва двойные кавычки, после одинарные. можно начинать с самого первого элемента
Windows экранирование сперва одинарные кавычки, после двойные. первый элемент экранировать нельзя

Запуск удаленного скрипта обнаружение файлов, через основной Windows
size-file.sh[{HOST.CONN},{$HOST.PORTS},runscriptwin,'{$SCRIPT.TRAPFILE}','"{HOST.HOST}"','"{$HOST.PORTSACTIV}"','"{$PUTFILE}"','"{$FILTRFILE}"','"{$HIDEFILE}"','"{$KODR}"']
/usr/local/share/zabbix/externalscripts/size-file.sh 192.168.XXX.XXX 10050 runscriptwin "C:\zabbix\Scripts\dir-file-trapper-win-cp866-File.bat" '"ИмяХоста"' '"10051"' '"C:\Users\Public;D:\test"' '".*"' '"^$"' '"cp866"'


Тесты слов с пробелами и экранированием
Для ключа в кавычках: traptest["6"]
zabbix_sender -z 192.168.XXX.XXX -p 10051 -s "Имя хоста" -k traptest[\"6\"] -o "4096"
Для ключа в кавычках и с пробелом: traptest["test top"]
zabbix_sender -z 192.168.XXX.XXX -p 10051 -s "Имя хоста" -k traptest[\""test top"\"] -o "40999996"
Для ключа без кавычек с пробелом: traptest[test top] (На выходе с траппера кавычки нужны в элементе нет)
zabbix_sender -z 192.168.XXX.XXX -p 10051 -s "Имя хоста" -k traptest["test top"] -o "409554jjj44556"

Без кавычек не создается элемент со спец символами например: folder["/root/test/,29"]
Первый способ самый простой обнаружение элементов и работа через zabbix agent если ответ будет успевать приходить за 15-30 секунд, используем следующие правила обнаружения в зависимости от OS:
Linux Обнаружение файлов в определенной директории
Windows Обнаружение файлов в определенной директории
LLD обнаружение файлов Linux Windows Работа через Zabbix Agent
LLD обнаружение файлов Linux Windows Работа через Zabbix Agent
Правило обнаружения: Linux Обнаружение файлов в определенной директории
Linux Обнаружение файлов в определенной директории
Linux Обнаружение файлов в определенной директории
Linux Обнаружение файлов в определенной директории
Показать
Имя: Linux Обнаружение файлов в определенной директории
Тип: Внешняя проверка
Ключ: size-file.sh[{HOST.CONN},{$HOST.PORTS},discovery,{$PUTFILE},{$FILTRFILE},{$HIDEFILE},{$KODR},{HOST.HOST},{$HOST.PORTSACTIV}]
Интервал обновления: 24h
Период сохранения потерянных ресурсов: 7d
Описание:
Директория где искать задается в Макросе узла
Так же указать порт если он отличается от 10050
Linux Прототипы элементов данных свойств файлов
Linux Прототипы элементов данных свойств файлов
Прототип элемента Время изменения свойств файла
Прототип элемента Время изменения свойств файла
Linux Обнаружение Прототип элемента Время изменения свойств файла
Показать
Имя: Время изменения свойств файла {#NAMEFILELINUX}
Тип: Zabbix Агент
Ключ: vfs.file.time["{#FILESIZELINUX}",change]
Тип информации: Числовой (с плавающей точкой)
Единица измерения: unixtime
Интервал обновления: 6h
Группы элементов данных: Проверка файлов
Описание: в формате ДД.ММ.ГГГГ ЧЧ:ММ:СС
Создать активированным: V
Прототип элемента Время изменения файла
Прототип элемента Время изменения файла
Linux Обнаружение Прототип элемента Время изменения файла
Показать
Имя: Время изменения файла {#NAMEFILELINUX}
Тип: Zabbix Агент
Ключ: vfs.file.time["{#FILESIZELINUX}",modify]
Тип информации: Числовой (с плавающей точкой)
Единица измерения: unixtime
Интервал обновления: 6h
Группы элементов данных: Проверка файлов
Описание: в формате ДД.ММ.ГГГГ ЧЧ:ММ:СС
Создать активированным: V
Прототип элемента Время последнего доступа
Прототип элемента Время последнего доступа
Linux Обнаружение Прототип элемента Время последнего доступа
Показать
Имя: Время последнего доступа {#NAMEFILELINUX}
Тип: Zabbix Агент
Ключ: vfs.file.time["{#FILESIZELINUX}",access]
Тип информации: Числовой (с плавающей точкой)
Единица измерения: unixtime
Интервал обновления: 6h
Группы элементов данных: Проверка файлов
Описание: в формате ДД.ММ.ГГГГ ЧЧ:ММ:СС
Создать активированным:
Прототип элемента Наличие файла
Прототип элемента Наличие файла
Linux Обнаружение Прототип элемента Наличие файла
Показать
Имя: Наличие файла {#NAMEFILELINUX}
Тип: Zabbix Агент
Ключ: vfs.file.exists["{#FILESIZELINUX}"]
Тип информации: Числовой (целое положительное)
Единица измерения:
Интервал обновления: 6h
Группы элементов данных: Проверка файлов
Описание:
1 - файл найден
0 - файл не найден
Создать активированным: V
Прототип элемента Размер файла
Прототип элемента Размер файла
Linux Обнаружение Прототип элемента Размер файла
Показать
Имя: Размер файла {#NAMEFILELINUX}
Тип: Zabbix Агент
Ключ: vfs.file.size["{#FILESIZELINUX}"]
Тип информации: Числовой (с плавающей точкой)
Единица измерения: B
Интервал обновления: 6h
Группы элементов данных: Проверка файлов
Описание: Запрос 4 раза в сутки, получаем размер файла в байтах
Создать активированным: V

Прототипы триггеров
Linux Обнаружение файлов Прототипы триггеров
Linux Обнаружение файлов Прототипы триггеров
Linux Обнаружение файлов Прототип триггера Размер файла Более
Linux Обнаружение файлов Прототип триггера Размер файла Более
Триггер Размер файла Более
Показать
Имя: {HOST.NAME}-Размер-файла-{#NAMEFILELINUX}-Более>9GB
Важность: Средняя
Выражение:
{Discovery-size-file:vfs.file.size["{#FILESIZELINUX}"].last()}>9663676416 or
{Discovery-size-file:vfs.file.size["{#FILESIZELINUX}"].nodata(25h)}=1
Разрешить закрывать вручную: V
Описание:
Размер файла {#FILESIZELINUX} на {HOST.NAME} более ГБ
Последнее значение: {ITEM.VALUE} {ITEM.LASTVALUE} ({TIME})
Если данных нет 25 часов ошибка

Создать активированным: V
Linux Обнаружение файлов Прототип триггера Файл старый или отсутствует либо битый
Linux Обнаружение файлов Прототип триггера Файл старый или отсутствует либо битый
Файл старый или отсутствует либо битый
Показать
Имя: Файл старый или отсутствует либо битый {#NAMEFILELINUX}
Важность: Средняя
Выражение:
{Discovery-size-file:vfs.file.exists["{#FILESIZELINUX}"].max(25h)}=0 or
{Discovery-size-file:vfs.file.time["{#FILESIZELINUX}",modify].fuzzytime(25h)}=0 or
{Discovery-size-file:vfs.file.size["{#FILESIZELINUX}"].last(#2)}/{Discovery-size-file:vfs.file.size["{#FILESIZELINUX}"].last()}<0.9 or
{Discovery-size-file:vfs.file.size["{#FILESIZELINUX}"].last()}/{Discovery-size-file:vfs.file.size["{#FILESIZELINUX}"].last(#2)}>1.1
Разрешить закрывать вручную: V
Описание:
Проверки:
1.Наличие файла
2.Дата изменения файла не более 25 часов
3.Проверяем что файл не битый и увеличения размера происходит нормально.
Старый размер делим на новый должно быть не меньше <0.9 или
новый размер файла делить на старый значение должно быть не больше>1.1
Значение должно быть в районе 1
Путь {#FILESIZELINUX}

Создать активированным: V
Windows Обнаружение файлов в определенной директории
Windows Обнаружение файлов в определенной директории
Windows Обнаружение файлов в определенной директории
Прототипы Элементов Windows Обнаружение файлов
Прототипы Элементов Windows Обнаружение файлов
Прототипы Элементов Windows Обнаружение файлов
Windows Обнаружение файлов Прототипы триггеров
Windows Обнаружение файлов Прототипы триггеров
Windows Обнаружение файлов Прототипы триггеров
Прототипы элемента данных Windows, все аналогично прототипам Элементов данных Linux
Прототипы триггеров так же аналогичны Linux прототипам
Отличие в макросах:
{#NAMEFILEWIN} - Имя файла
{#FILESIZEWIN} - путь и имя файла


При возникновении ошибки в правиле обнаружения ошибка прилетает в элемент данных
Ошибки Правила Обнаружения Файлов
Показать
Имя: Ошибки Правила Обнаружения Файлов
Тип: Zabbix траппер
Ключ: errordiscoveryfile
Тип информации: Текст
Период хранения истории: 90d
Группы элементов данных: Проверка файлов
Активировано: V
Ошибки Правила Обнаружения Файлов
Ошибки Правила Обнаружения Файлов
Скрипт size-file.sh
size-file.sh
Показать

Код: Выделить всё

#!/bin/bash
#2021/09/01 v1
# Автор Мамзиков Артём Андреевич Описание по скрипту
# Получение списка файлов в папке в определенной директории и мониторинг их размера

# Объявим входные переменные(variable) и если входная переменная пустая задаем дефолтные настройки для некоторых переменных
IP=$1
PORT=${2:-10050}
BLOCSCRIPT=$3
DIRPUT=$4
FILTR=${5:-.*}
HIDE=${6:-^$}
KODR="${7:-cp866}"
HOSTNAME=$8
ACTIVPORT=${9:-10051}

# Для теста просмотр входных переменных
STV=$(date "+%F %T")
#echo "${STV}" "${IP}" "${PORT}" "${BLOCSCRIPT}" "${DIRPUT}" "${FILTR}" "${HIDE}" "${HOSTNAME}" "${ACTIVPORT}" >> /tmp/log

IFS=$'\n'
SEP=""

if [[ $BLOCSCRIPT = "discovery" ]]
then
# Проверка нескольких директорий на 1 хосте, делим через ;
IFS=';' read -ra sumdir < <(echo $DIRPUT)
# Печать разделенной строки
for puti in "${sumdir[@]}"
do
# ls -aF a -отобразить все содержимое, параметр F -Добавить специальные символы к именам файлов, которые показывают, что это за файл, -v "/" не отображать директории(папки)
get=`zabbix_get -s $IP -p $PORT -k system.run["ls -aF "${puti}"|grep -av "/""]`
# Запрашиваем файлы в папке циклом, так же можем задать соответствие имен через |
#for filep in $(echo "${get}" 2>/dev/null| grep -i -E -a -w "$5")

# убрать спец символы в конце файлов|Для выполнения команды в sed указать команду $(команда) например $(date +"%d.%m.%Y") можно дополнить \|искомые\|искомые'/Ip' получаем sed -n '/'$(date +"%d.%m.%Y")'\|искомые\|искомые'/Ip'
for filep in $(echo "${get}" 2>/dev/null|sed 's/\*$\|\@$//g'|sed -n '/'$FILTR'/Ip'|sed -e '/'$HIDE'/d')
do

JSON=$JSON"$SEP\n{\"{#FILESIZELINUX}\":\""${puti}"/$filep\", \"{#NAMEFILELINUX}\":\"$filep\"}"
SEP=", "
done
done
# Выводим результат в json
JSON="["$JSON"\n]"
echo -e "${JSON}"
fi


if [[ $BLOCSCRIPT = "discoverywin" ]]
then
# Проверка нескольких директорий на 1 хосте, делим через ;
IFS=';' read -ra sumdir < <(echo $DIRPUT)
# Печать разделенной строки
for puti in "${sumdir[@]}"
do
get=`zabbix_get -s $IP -p $PORT -k system.run["dir /a-d /B \""${puti}"\""]`
# Избавимся от CR Возврат каретки если нужно можно еще от LF Перевод строки \r \n ; главное убрать \r иначе ломает весь вывод
obr=$(echo "${get}"|tr -d '\r')
# Запрашиваем файлы циклом
#for filep in "${obr}"
# Если корректно не отображается русский перекодируем из cp866 или cp1251 в utf8
for filep in $(echo "${obr}"|iconv -f "${KODR}" -t utf8| sed -n '/'$FILTR'/Ip'|sed -e '/'$HIDE'/d')
do
# Для передачи на заббикс сервер при выводе должно быт два слеша \\ (на каждом этапе теряется 1 слеш и 1 слеш экранирует другой)
#put=$(echo "${puti}"|sed 's/\\/\\\\\\/g')
SL='\\\'
put="${puti//\\/\'\\\\\\\'}"
JSON=$JSON"$SEP\n{\"{#FILESIZEWIN}\":\""${put}"'$SL'"${filep}"\", \"{#NAMEFILEWIN}\":\"$filep\"}"

# Ввиду сложности передачи слешей windows, преобразуем в пути \ в обратные слеши /
#put=$(echo "${puti}"|sed 's/\\/\//g')
#put="${puti//\\//}"
# Объединим все в один путь, в одну выходную переменную
#JSON=$JSON"$SEP\n{\"{#FILESIZEWIN}\":\""${put}"/$filep\", \"{#NAMEFILEWIN}\":\"$filep\"}"

SEP=", "
done
done
# Выводим результат в json
JSON="["$JSON"\n]"
# Вывод построчно с экранированными кавычками слешами '\\'
JSON=$(echo -e "${JSON}")
# Избавимся от одинарных кавычек ' и получим читаемый построчный вариант
echo "${JSON//\'/}"
fi

# Проверка на ошибки, так как для 1 узла одновременно могут быть указаны несколько программ одна из них может давать ошибку в этом случае от другой программы JONS не примется, поэтому скрываем ошибки
# Ответы с хоста|Преобразуем в 1 строку|Ищем регуляркой ошибки, если найдено выводим ERROR и убираем из вывода HW с ошибкой. А ошибки отправляем траппером в элемент "Ошибки Правила Обнаружения HM"|Скрыть вывод
check=$(echo "${get}"|tr -d '\r\n'| sed -n 's/No Instance(s) Available.*\|Node.*\|ERROR.*\|Invalid.*\|fatal:.*\|команда не найдена.*\|.*невозможно получить доступ.*\|.*Cannot obtain file information.*\|.*Нет такого файла или каталога.*\|.*No such file or directory.*\|.*Файл не найден.*/ERROR/Ip')
# Указываем IP или DNS Заббикс сервера, по умолчанию должно работать localhost так как скрипт находится на самом сервере заббикс.
IPZBXSERVER=localhost
# Очистить строки если ошибка в ПО, по имени программы удалим строки из вывода содержащие ее.; отправить траппер с ошибкой.
if [[ ${check} == *ERROR* ]]; then zabbix_sender -z $IPZBXSERVER -p $ACTIVPORT -s ""${HOSTNAME}"" -k errordiscoveryfile -o ""${get}"" > /dev/null;fi


if [[ $BLOCSCRIPT = "runscript" ]]
then
zabbix_get -s $IP -p $PORT -k system.run["$4 $5 $6 $7 $8 $9 ${10}",nowait]
# Для тестирования вывод в лог
#SDATE=`date '+%d.%m.%y %H:%M:%S'`
#echo ${SDATE} zabbix_get -s $1 -p $2 -k system.run["$4 $5 $6 $7 $8 $9 ${10}",nowait] >> /tmp/log
fi

if [[ $BLOCSCRIPT = "runscriptwin" ]]
then
# Удалим одинарные кавычки из входных переменных, так как они не принимаются в cmd нужны только 2-ные кавычки
four=`echo $4|sed 's/^'\''\|'\''$//g'`
five=`echo $5|sed 's/^'\''\|'\''$//g'`
six=`echo $6|sed 's/^'\''\|'\''$//g'`
seven=`echo $7|sed 's/^'\''\|'\''$//g'`
eight=`echo $8|sed 's/^'\''\|'\''$//g'`
nine=`echo $9|sed 's/^'\''\|'\''$//g'`
ten=`echo ${10}|sed 's/^'\''\|'\''$//g'`
zabbix_get -s $IP -p $PORT -k system.run["${four} ${five} ${six} ${seven} ${eight} ${nine} ${ten}",nowait]
# Для тестирования вывод в лог
#SDATE=`date '+%d.%m.%y %H:%M:%S'`
#echo ${SDATE} zabbix_get -s $1 -k system.run["${four} ${five} ${six} ${seven} ${eight} ${nine} ${ten}",nowait] >> /tmp/log
fi

2 Способ получение данных через trapper

Обнаружение происходит аналогично 1 способу, но прототипы элементов отличаются от первого варианта.
Для долгих запросов которые не успевают опоросится через Zabbix Agent.
LLD обнаружение файлов Linux Windows Работа через Trapper
LLD обнаружение файлов Linux Windows Работа через Trapper
Linux Обнаружение Файлов в определенной директории Trapper
Показать
Имя: Linux Обнаружение Файлов в определенной директории Trapper
Тип: Внешняя проверка
Ключ: size-file.sh[{HOST.CONN},{$HOST.PORTS},discovery,{$PUTFILE},{$FILTRFILE},{$HIDEFILE},{$KODR},{HOST.HOST},{$HOST.PORTSACTIV},trapper]
Интервал обновления: 24h
Период сохранения потерянных ресурсов: 7d
Описание:
Директория где искать задается в Макросе узла
Так же указать порт если он отличается от 10050
Для долгих запросов, используем скрипт, через крон или заббикс элемент и траппер для передачи данных информации о файлах
Linux Обнаружение Файлов в определенной директории Trapper
Linux Обнаружение Файлов в определенной директории Trapper
Linux Прототипы элементов данных свойств файлов Trapper
Linux Прототипы элементов данных свойств файлов Trapper
Trapper-Время изменения свойств файла {#NAMEFILELINUX}
Показать
Имя: Trapper-Время изменения свойств файла {#NAMEFILELINUX}
Тип: Zabbix траппер
Ключ: trapstimechange["{#FILESIZELINUX}"]
Тип информации: Текст
Группы элементов данных: Проверка файлов
Описание: в формате ДД.ММ.ГГГГ ЧЧ:ММ:СС
Создать активированным: V
На момент написание дата приходит как есть, а не в числовом значении unixtime .
Trapper-Время изменения свойств файла {#NAMEFILELINUX}
Trapper-Время изменения свойств файла {#NAMEFILELINUX}
Остальные прототипы элементов так же идентичны 1 способу.
Отличие в том что:
1.В имя добавлено: Trapper-
2.Тип: Zabbix траппер
3.Ключи: trapstimechange["{#FILESIZELINUX}"] ; trapstimemodify["{#FILESIZELINUX}"] ; trapstimeaccess["{#FILESIZELINUX}"] ; trapexists["{#FILESIZELINUX}"] ; trapsizefile["{#FILESIZELINUX}"]

Данные приходят в элементы при помощи скрипта который необходимо поместить на наблюдаемый узел.
Пример расположения: /etc/zabbix/scripts/dir-file-trappet.sh
dir-file-trappet.sh
Показать

Код: Выделить всё

#!/bin/bash

# Входные данные $1 -Имя узла сети {HOST.HOST} ; $2 -Активный порт агента ;$3 - директории через точку запятую какие нужно проверить
# Пример команды ./ИмяТекущегоСкрипта.sh "HOST.HOST" "/root;/var/www/owncloud/data"
# Данный скрипт в указанной папке сканирует файлы, далее поочередно запрашивает их размер

# Объявим входные переменные(variable) и если входная переменная пустая задаем дефолтные настройки для некоторых переменных
NAMEHOST=$1
PORT=${2:-10051}
DIRPUT=$3
FILTR=${4:-.*}
HIDE=${5:-^$}

# Для теста просмотр входных переменных
STV=$(date "+%F %T")
#echo "${STV}" "${NAMEHOST}" "${DIRPUT}" "${FILTR}" "${HIDE}" >> log

# Указываем IP или DNS Заббикс сервера, по умолчанию должно работать localhost так как скрипт находится на самом сервере заббикс.
IPZBXSERVER=192.168.175.111

# Проверка нескольких директорий на 1 хосте, делим через ;
IFS=';' read -ra sumdir < <(echo "${DIRPUT}")

# Печать разделенной строки
for puti in "${sumdir[@]}"
do
# # ls -aF a -отобразить все содержимое, параметр F -Добавить специальные символы к именам файлов, которые показывают, что это за файл|скроем из вывода директории (папки)
get=`ls -aF "${puti}"|grep -av "/"`

# Запрашиваем файлы циклом
IFS=$'\n'
for filep in $(echo "${get}" 2>/dev/null|sed 's/\*$\|\@$//g'|sed -n '/'$FILTR'/Ip'|sed -e '/'$HIDE'/d')
do
putfile="${puti}"/"${filep}"

#Наличие файла
if [ -f "${putfile}" ]; then exists=1; else exists=0; fi
# Получение размера в байтах и даты изменения
features=`du -sb --time "${putfile}"`
# Получение размера в байтах | первый столбец
sizefile=`echo "${features}"| awk '{print $1}'`
# Время изменения файла в формате ГГГГ.ММ.ДД ЧЧ:ММ
timemodify=`echo "${features}"| awk '{print $2, $3}'`
# Время изменения свойств файла в формате ГГГГ.ММ.ДД ЧЧ:ММ
timechange=`du -sb --time=ctime "${putfile}"| awk '{print $2, $3}'`
# Время последнего доступа в формате ГГГГ.ММ.ДД ЧЧ:ММ
timeaccess=`du -sb --time=atime "${putfile}"| awk '{print $2, $3}'`

# Формирование массива JONS
JSON=$JSON""${putfile}" exists:"${exists}" sizefile:"${sizefile}" timemodify:"${timemodify}" timechange:"${timechange}" timeaccess:"${timeaccess}"\n"

# Вывод по очередно и отправка траппетом для каждого файла отдельно, Для правила обнаружения Linux Обнаружение Файлов в определенной директории Trapper
#echo "${putfile}" exists:"${exists}" sizefile:"${sizefile}" timemodify:"${timemodify}" timechange:"${timechange}" timeaccess:"${timeaccess}"

# Отправка данных Наличие файла
#zabbix_sender -z "${IPZBXSERVER}" -p "${PORT}" -s ""${NAMEHOST}"" -k trapexists[\"""${putfile}""\"] -o ""${exists}""
# Отправка данных Размер файла
#zabbix_sender -z "${IPZBXSERVER}" -p "${PORT}" -s ""${NAMEHOST}"" -k trapsizefile[\"""${putfile}""\"] -o ""${sizefile}""
# Отправка данных Время изменения файла
#zabbix_sender -z "${IPZBXSERVER}" -p "${PORT}" -s ""${NAMEHOST}"" -k trapstimemodify[\"""${putfile}""\"] -o ""${timemodify}""
# Отправка данных Время изменения свойств файла
#zabbix_sender -z "${IPZBXSERVER}" -p "${PORT}" -s ""${NAMEHOST}"" -k trapstimechange[\"""${putfile}""\"] -o ""${timechange}""
# Отправка данных Время последнего доступа
#zabbix_sender -z "${IPZBXSERVER}" -p "${PORT}" -s ""${NAMEHOST}"" -k trapstimeaccess[\"""${putfile}""\"] -o ""${timeaccess}""

# Очистка переменных, от случайного попадания предыдущего значения
exists=
sizefile=
timemodify=
timechange=
timeaccess=
done
done

# Вывод одним списком для всех файлов и отправка в виде Лога, Для правила обнаружения Linux Обнаружение Файлов в определенной директории Trapper Логом, через элемент Info-File-Trapper-LOG-Linux
#echo -e "${JSON}"
# Вывод визуально построчно
JSON=$(echo -e "${JSON}")
zabbix_sender -z "${IPZBXSERVER}" -p "${PORT}" -s ""${NAMEHOST}"" -k filelog -o "${JSON}"

# Проверка на ошибки, так как для 1 узла одновременно могут быть указаны несколько программ одна из них может давать ошибку в этом случае от другой программы JONS не примется, поэтому скрываем ошибки
# Ответы с хоста|Преобразуем в 1 строку|Ищем регуляркой ошибки, если найдено выводим ERROR и убираем из вывода HW с ошибкой. А ошибки отправляем траппером в элемент "Ошибки Правила Обнаружения HM"|Скрыть вывод
check=$(echo "${get}"|tr -d '\r\n'| sed -n 's/No Instance(s) Available.*\|Node.*\|ERROR.*\|Invalid.*\|fatal:.*\|команда не найдена.*\|невозможно получить доступ.*\|Cannot obtain file information.*\|Нет такого файла или каталога.*\|No such file or directory.*\|.*Файл не найден.*/ERROR/Ip')
# Очистить строки если ошибка в ПО, по имени программы удалим строки из вывода содержащие ее.; отправить траппер с ошибкой.
if [[ ${check} == *ERROR* ]]; then zabbix_sender -z "${IPZBXSERVER}" -p "${PORT}" -s ""${NAMEHOST}"" -k errordiscoveryfile -o ""${get}"" > /dev/null;fi
Для 2 способа раскомментировать данный блок в скрипте как показано ниже
Данный блок отвечает за передачу данных в элементы траппетом по циклу
Показать
Его нужно раскоментировать в скрипте для данного способа

Код: Выделить всё

# Отправка данных Наличие файла
zabbix_sender -z "${IPZBXSERVER}" -p "${PORT}" -s ""${NAMEHOST}"" -k trapexists[\"""${putfile}""\"] -o ""${exists}""
# Отправка данных Размер файла
zabbix_sender -z "${IPZBXSERVER}" -p "${PORT}" -s ""${NAMEHOST}"" -k trapsizefile[\"""${putfile}""\"] -o ""${sizefile}""
# Отправка данных Время изменения файла
zabbix_sender -z "${IPZBXSERVER}" -p "${PORT}" -s ""${NAMEHOST}"" -k trapstimemodify[\"""${putfile}""\"] -o ""${timemodify}""
# Отправка данных Время изменения свойств файла
zabbix_sender -z "${IPZBXSERVER}" -p "${PORT}" -s ""${NAMEHOST}"" -k trapstimechange[\"""${putfile}""\"] -o ""${timechange}""
# Отправка данных Время последнего доступа
zabbix_sender -z "${IPZBXSERVER}" -p "${PORT}" -s ""${NAMEHOST}"" -k trapstimeaccess[\"""${putfile}""\"] -o ""${timeaccess}""
Данную строку наоборот закомментировать, она для 3 способа

Код: Выделить всё

#zabbix_sender -z "${IPZBXSERVER}" -p "${PORT}" -s ""${NAMEHOST}"" -k filelog -o "${JSON}"
Как запускается скрипт dir-file-trappet.sh
Запуск происходит через элемент данных в заббиксе, при желании можно сделать через Cron указав переменные.
Запуск удаленного скрипта обнаружение файлов Linux Trapper
Запуск удаленного скрипта обнаружение файлов Linux Trapper
Запуск удаленного скрипта обнаружение файлов, через заббикс агент Linux
Показать
Имя: Запуск удаленного скрипта обнаружение файлов, через заббикс агент Linux
Тип: Zabbix Агент
Ключ: system.run['{$SCRIPT.TRAPFILE}' "{HOST.HOST}" "{$HOST.PORTSACTIV}" "{$PUTFILE}" "{$FILTRFILE}" "{$HIDEFILE}",nowait]
Тип информации: Числовой(целое положительное)
Интервал обновления: 6h
Группы элементов данных: Проверка файлов
Описание:
Запуск удаленного скрипта, через заббикс агент
Для получение данных о размере файлов через trapper
Вместо крона запуск со стороны заббикс сервера
Активировано:
Запуск удаленного скрипта обнаружение файлов, через заббикс агент Linux
Запуск удаленного скрипта обнаружение файлов, через заббикс агент Linux
Запуск удаленного скрипта обнаружение файлов, через основной Linux
Показать
Имя: Запуск удаленного скрипта обнаружение файлов, через основной Linux
Тип: Внешняя проверка
Ключ: size-file.sh[{HOST.CONN},{$HOST.PORTS},runscript,'{$SCRIPT.TRAPFILE}',"'{HOST.HOST}'","'{$HOST.PORTSACTIV}'","'{$PUTFILE}'","'{$FILTRFILE}'","'{$HIDEFILE}'"]
Тип информации: Числовой(целое положительное)
Интервал обновления: 6h
Группы элементов данных: Проверка файлов
Описание:
Запуск удаленного скрипта, через основной
Для получение данных о размере файлов через trapper
Вместо крона запуск со стороны заббикс сервера

Получаем команду
zabbix_get -s $IP -p $PORT -k system.run["$4 $5 $6 $7 $8 $9 ${10}",nowait]
Активировано:
Запуск удаленного скрипта обнаружение файлов, через основной Linux
Запуск удаленного скрипта обнаружение файлов, через основной Linux

3 Способ получение данных через trapper-Log
Похож на 2 способ, отличие в том что скрипт (тот же самый dir-file-trappet.sh) собирает данные и одним разом отправляет их в 1 элемент данных. Далее прототипы элементов данных Зависимы от основанного элемента куда пришли все данные, после предобработкой регулярным выражением разбираются данные.
Данная строка должны быть раскомментирована

Код: Выделить всё

zabbix_sender -z "${IPZBXSERVER}" -p "${PORT}" -s ""${NAMEHOST}"" -k filelog -o "${JSON}"
Если используются оба 2 и 3 условия для разных узлов, оба варианта в скрипте должны быть раскомментированы!
Возможно для таких случаев сделать условие в скрипте и добавить макрос. (лишний раз впустую не запускать zabbix_sender и не отправлять данные в никуда)

Данные будут попадать в элемент:
Info-File-Trapper-LOG-Linux
Показать
Имя: Info-File-Trapper-LOG-Linux
Тип: Zabbix траппер
Ключ: filelog
Тип информации: Текст
Период хранения истории: 90d
Группы элементов данных: Проверка файлов
Описание:
Для долгих элементов подсчета размера файлов
Общий Лог пути и размер файлов, на него настраиваем зависимые элементы
Активировать необходимо если используется правило авто обнаружения
Linux Обнаружение файлов в определенной директории Trapper Логом
Активировано: V
Info-File-Trapper-LOG-Linux
Info-File-Trapper-LOG-Linux
LLD обнаружение файлов Linux Windows Работа через Trapper-Log
LLD обнаружение файлов Linux Windows Работа через Trapper-Log
Linux Обнаружение Файлов в определенной директории Trapper Логом
Показать
Имя: Linux Обнаружение Файлов в определенной директории Trapper Логом
Тип: Внешняя проверка
Ключ: size-file.sh[{HOST.CONN},{$HOST.PORTS},discovery,{$PUTFILE},{$FILTRFILE},{$HIDEFILE},{$KODR},{HOST.HOST},{$HOST.PORTSACTIV},trapper_log]
Интервал обновления: 24h
Период сохранения потерянных ресурсов: 7d
Описание:
Директория где искать задается в Макросе узла
Так же указать порт если он отличается от 10050
Для долгих запросов,используем скрипт, через крон или элемент заббикс далее траппер отправляет данные одним разом (логом) в 1 элемент, после зависимые элементы распаривают данные.
Linux Обнаружение Файлов в определенной директории Trapper Логом
Linux Обнаружение Файлов в определенной директории Trapper Логом
Linux Прототипы элементов данных свойств файлов Trapper-Log
Linux Прототипы элементов данных свойств файлов Trapper-Log
Прототип элемента данных
Trapper-LOG-Время изменения свойств файла {#NAMEFILELINUX}
Показать
Имя: Trapper-LOG-Время изменения свойств файла {#NAMEFILELINUX}
Тип: Зависимый элемент данных
Основной элемент данных: Обнаружение файлов и запрос их размера: Info-File-Trapper-LOG-Linux
Ключ: logtimechange["{#FILESIZELINUX}"]
Тип информации: Текст
Группы элементов данных: Проверка файлов
Описание:
Получаем Время изменения свойств файла {#NAMEFILELINUX} с помощью скрипта и траппера , которые долго обсчитываются. Получаем их из общего лога элемента и обрабатываем регулярным выражением.
Полный путь {#FILESIZELINUX}
формате ГГГГ.ММ.ДД ЧЧ:ММ
Создать активированным: V

Предобработка
Регулярное выражение
{#FILESIZELINUX}.*timechange:(.*) timeaccess:
вывод \1
Trapper-LOG-Время изменения свойств файла {#NAMEFILELINUX}
Trapper-LOG-Время изменения свойств файла {#NAMEFILELINUX}
Остальные прототипы элементов так же идентичны 1 и 2 способу.
Отличие в том что:
1.В имя добавлено: Trapper-LOG-
2.Тип: Зависимый элемент данных
3.Основной элемент данных: Обнаружение файлов и запрос их размера: Info-File-Trapper-LOG-Linux
4.Ключи: logtimechange["{#FILESIZELINUX}"] ; logtimemodify["{#FILESIZELINUX}"] ; logtimeaccess["{#FILESIZELINUX}"] ; logexists["{#FILESIZELINUX}"] ; logsizefile["{#FILESIZELINUX}"]
5. Предобработка: регулярное выражение
{#FILESIZELINUX}.*timechange:(.*) timeaccess:
{#FILESIZELINUX}.*timemodify:(.*) timechange
{#FILESIZELINUX}.*timeaccess:(.*)
{#FILESIZELINUX}.*exists:(.*) sizefile:
{#FILESIZELINUX}.*sizefile:(.*) timemodify:
Вывод везде в: \1
количество слов: 3813
Аватара пользователя
Артём Мамзиков
Admin
Сообщения: 857
Стаж: 5 лет 8 месяцев
Откуда: Вологодская область
Поблагодарили: 37 раз
Контактная информация:

Обнаружение файлов и запрос их наличия, размера, даты изменения Шаблон + LLD скрипт

Сообщение Артём Мамзиков »

Получение списка файлов для Linux их мониторинга мы рассмотрели, далее рассмотрим для Windows.
Первый способ самый простой обнаружение элементов и работа через zabbix agent

Правило обнаружения
Windows Обнаружение файлов в определенной директории
Показать
Имя: Windows Обнаружение файлов в определенной директории
Тип: Внешняя проверка
Ключ: size-file.sh[{HOST.CONN},{$HOST.PORTS},discoverywin,{$PUTFILE},{$FILTRFILE},{$HIDEFILE},{$KODR},{HOST.HOST},{$HOST.PORTSACTIV}]
Интервал обновления: 24h
Период сохранения потерянных ресурсов: 30d
Описание:
Директория где искать задается в Макросе узла
Так же указать порт если он отличается от 10050
Декодировка Windows для Русского указать в макросе узла
Для определения какая у вас кодировка запросите в cmd команду
chcp
Windows Обнаружение файлов в определенной директории
Windows Обнаружение файлов в определенной директории
Прототипы элементов данных и триггеров Windows Обнаружение файлов в определенной директории
Прототипы элементов данных и триггеров Windows Обнаружение файлов в определенной директории
Все аналогично Прототипам элементам данных и триггерам Linux способа
Отличие только в имени на элемент данных так как это другое правило и 2 макроса
{#NAMEFILEWIN} - имя файла
{#FILESIZEWIN} - полный путь с самим файлом


2 Способ получение данных через trapper

Данный способ не поддерживает прием данных от файлов с русским именем!
Так как не перекодирует перед передачей из cp866 в utf-8 и заббикс такие данные не принимает.

Правило обнаружения
Windows Обнаружение Файлов в определенной директории Trapper
Показать
Имя: Windows Обнаружение Файлов в определенной директории Trapper
Тип: Внешняя проверка
Ключ: size-file.sh[{HOST.CONN},{$HOST.PORTS},discoverywin,{$PUTFILE},{$FILTRFILE},{$HIDEFILE},{$KODR},{HOST.HOST},{$HOST.PORTSACTIV},trapper]
Интервал обновления: 24h
Период сохранения потерянных ресурсов: 30d
Описание:
Директория где искать задается в Макросе узла
Декодировка Windows для Русского шрифта из
Для определения какая у вас кодировка запросите в cmd команду
chcp
Для долгих запросов, используем скрипт, через zabbix агент или планировщик заданий и траппер для передачи данных в каждый элемент данных.
Правило обнаружения Windows Обнаружение файлов в определенной директории Trapper
Правило обнаружения Windows Обнаружение файлов в определенной директории Trapper
Прототипы элементов данных и триггеров Windows Обнаружение Файлов в определенной директории Trapper
Прототипы элементов данных и триггеров Windows Обнаружение Файлов в определенной директории Trapper
Прототипы элементов данных и триггеров Windows Обнаружение Файлов в определенной директории Trapper
Прототип элемента данных
Trapper-Размер файла {#NAMEFILEWIN}
Показать
Имя: Trapper-Размер файла {#NAMEFILEWIN}
Тип: Zabbix траппер
Ключ: trapsizefile["{#FILESIZEWIN}"]
Тип информации: Числовой (с плавающей точкой)
Единица измерения: B
Период хранения истории: 90d
Период хранения динамики изменений: 90d
Группы элементов данных: Проверка файлов
Описание: получаем размер файла в байтах
Создать активированным: V
Trapper-Размер файла {#NAMEFILEWIN}
Trapper-Размер файла {#NAMEFILEWIN}
Остальные прототипы элементов так же идентичны 1 способу.
Отличие в том что:
1.В имя добавлено: Trapper-
2.Тип: Zabbix траппер
3.Ключи: trapsizefile["{#FILESIZEWIN}"] ; trapexists["{#FILESIZEWIN}"] ; trapstimeaccess["{#FILESIZEWIN}"] ; trapstimemodify["{#FILESIZEWIN}"]; trapstimechange["{#FILESIZEWIN}"]

Передача данных происходит через скрипт dir-file-trapper-win-cp866-File.bat
есть еще 2 варианта данного скрипта в одном немного изменена логика и последовательность, и еще один сделан в кодировке 1251
dir-file-trapper-win-cp866-File.bat
Показать
Скрипт в кодировке cp866
cp866
cp866

Код: Выделить всё

@echo off
mode con:cols=130 lines=1000
color 1a
:: Автор Мамзиков Артём Андреевич
:: V 5.0 22.11.2021
TITLE dir-file-trapper-win

setlocal enabledelayedexpansion
:: Входные переменные %1 - имя узла, 2% - Порт активный, %3 - путь сканируемой директории, 4% - что показать, 5% - что скрыть, 6% - кодировка
set pcname=%1
set port=%2
set way=%3
set filtr=%4
set hide=%5
::set kodr=%6

:: Если переменная пустая (в кавычках "" и без) пропишем стандартные данные
IF /i %filtr%1==""1 (set filtr=".")
IF /i "!filtr!"1==""1 (set filtr=".")
IF /i %hide%1==""1 (set hide="'")
IF /i "!hide!"1==""1 (set hide="'")
:: В шаблоне, для Linux указано .* и ^$ если не изменено меняем на . 
IF /I [%filtr%]==[".*"] (set filtr=".")
IF /I [%hide%]==["^$"] (set hide="'")

:: Преобразуем переменные фильтров
set filtr=%filtr:\|=";"%
for %%a in (%filtr%) do set filtre=!filtre!/c:%%a 
set filtr=%filtre%

set hide=%hide:\|=";"%
for %%b in (%hide%) do set hidep=!hidep!/c:%%b 
set hide=%hidep%

:: Проверка входных переменных
::echo %date% %time% %pcname% %port% %way% %filtr% %hide% %kodr% >> filetraplog.txt

:: Указываем IP или DNS Заббикс сервера, по умолчанию должно работать localhost так как скрипт находится на самом сервере заббикс.
set IPZBXSERVER=192.168.175.111

:: Так как элементы данных у нас обнаруживаются с обычным слешем /, а для выполнения команд нам нужен обратный слешь \ , разворачиваем.
::set way=%way:/=\%
::set way="C:\Users\14-1;C:\Program Files (x86);C:\Users\All Users"
:: Экранируем пути добавляем кавычки было ; стало ";"
set way=%way:;=";"%
:: Разбор входных директорий, если их несколько
for %%a in (%way%) do (
:: Запрос содержание данной директории (накопительная переменная) + фильтрация
for /f "tokens=1 delims=" %%b in ('dir /a-d /B %%a\ 2^>nul^|findstr/ir %filtr%^|findstr/irv %hide%') do set puti=!puti!%%a\%%b;
)
:: Уберем последнюю ; так как она потом создает пустую переменную "" которая выполняет команду для текущей директории.
set puti=%puti:~0,-1%
:: Убираем все кавычки
set puti=%puti:"=%
:: Заново экранируем строку путь
set puti="%puti:;=";"%"
::echo %puti%
:: Разбор по адресам (путям)
for %%c in (%puti%) do set filename=%%c& call:size

:: Меняем кодировку через файл так как Zabbix sender принимает строки в UTF-8 кодировке
:: Определение текущей кодировки может отличатся 866 и 1251
for /f "tokens=2 delims=:" %%s in ('chcp') do set "kodstr=%%s"
:: Вывод в кодировке UTF-8 (Zabbix sender принимает строки в UTF-8 кодировке (BOM))
chcp 65001 > nul
:: Вывод одним списком для всех файлов и отправка в виде Лога
echo "%JSON%" >> "%~dp0SIZEFILE.TXT"
:: Cкрыть временный файл
::copy /b NUL "%~dp0SIZEDIR.TXT"
attrib +h "%~dp0SIZEFILE.TXT"
:: Кодировка 1251
chcp 1251 > nul
:: Читаем перекодированный файл и выводим в переменную
for /f "usebackq tokens=*" %%t in ("%~dp0SIZEFILE.TXT") do set JSON=%%t
zabbix_sender.exe -z %IPZBXSERVER% -p %port% -s "%pcname%" -k filelogwin -o %JSON%
:: Удаление файла
del /F /Q /A:H "%~dp0SIZEFILE.TXT"
:: Возврат кодировки
chcp %kodstr:~1% > nul
:end

:size
:: Наличие файла
IF EXIST %filename% (set exists=1) ELSE (set exists=0)
:: Получаем размер директории в байтах (слово файлов в cp1251 "д c<Rў" cp866 "д c<Rў" зависит оттекущей кодировки скрипта)
::for /f "tokens=1-3" %%d in ('2^>nul Dir %filename% /-C /S /A:-D^|find /I "файлов"') Do Set sizefile=%%f
for %%k in (%filename%) do Set sizefile=%%~zk
:: Время изменения файла (модификация последней операции записи)
::for /f "tokens=1-5 delims=.: " %%j in ('2^>nul Dir %filename% /T:W^|findstr /rc:"[0-9]\..*"') do set timemodify=%%l.%%k.%%j %%m:%%n
for %%i in (%filename%) do set timemodify=%%~ti
:: Время изменения свойств файла (время создания)
for /f "tokens=1-5 delims=.: " %%j in ('2^>nul Dir %filename% /T:C^|findstr /rc:"^[^ ]"') do set timechange=%%l.%%k.%%j %%m:%%n
:: Время последнего доступа (Последнее использование, последний доступ)
for /f "tokens=1-5 delims=.: " %%j in ('2^>nul Dir %filename% /T:A^|findstr /rc:"[0-9]\..*"') do set timeaccess=%%l.%%k.%%j %%m:%%n
:: Разворачиваем слеши, для совпадения ключей на заббик сервере и правильной работе регулярного выражения
::set filename=%filename:\=/%
:: Вывод поочередно и отправка траппетом для каждого файла отдельно. (вместо set JSON=!JSON!%FileNS%) не поддерживает русские имена папок
:: Отправка данных Наличие файла
::zabbix_sender -z %IPZBXSERVER% -p %port% -s "%pcname%" -k trapexists[\"%filename%\"] -o "%exists%"
:: Отправка данных Размер файла
::zabbix_sender -z %IPZBXSERVER% -p %port% -s "%pcname%" -k trapsizefile[\"%filename%\"] -o "%sizefile%"
:: Отправка данных Время изменения файла
::zabbix_sender -z %IPZBXSERVER% -p %port% -s "%pcname%" -k trapstimemodify[\"%filename%\"] -o "%timemodify%"
:: Отправка данных Время изменения свойств файла
::zabbix_sender -z %IPZBXSERVER% -p %port% -s "%pcname%" -k trapstimechange[\"%filename%\"] -o "%timechange%"
:: Отправка данных Время последнего доступа
::zabbix_sender -z %IPZBXSERVER% -p %port% -s "%pcname%" -k trapstimeaccess[\"%filename%\"] -o "%timeaccess%"

set FileNS=%filename% exists:%exists% sizefile:%sizefile% timemodify:%timemodify% timechange:%timechange% timeaccess:%timeaccess%\n
::echo FileNS=%filename% exists:%exists% sizefile:%sizefile% timemodify:%timemodify% timechange:%timechange% timeaccess:%timeaccess%\n

:: Очистка переменных, от случайного попадания предыдущего значения
set exists=
Set sizefile=
set timemodify=
set timechange=
set timeaccess=

set JSON=!JSON!%FileNS%
:: Убираем все кавычки
set JSON=%JSON:"=%
setlocal DISABLEDELAYEDEXPANSION
Скрипт dir-file-trapper-win-cp866-Fileif.bat блоками по условию в целом аналогичен скрипту выше
dir-file-trapper-win-cp866-Fileif.bat
Показать
cp866
cp866

Код: Выделить всё

@echo off
mode con:cols=130 lines=1000
color 1a
:: Автор Мамзиков Артём Андреевич
:: V 5.0 22.11.2021
TITLE dir-file-trapper-win

setlocal enabledelayedexpansion
:: Входные переменные %1 - имя узла, 2% - Порт активный, %3 - путь сканируемой директории, 4% - что показать, 5% - что скрыть, 6% - кодировка
set pcname=%1
set port=%2
set way=%3
set filtr=%4
set hide=%5
::set kodr=%6

:: Если переменная пустая (в кавычках "" и без) пропишем стандартные данные
IF /i %filtr%1==""1 (set filtr=".")
IF /i "!filtr!"1==""1 (set filtr=".")
IF /i %hide%1==""1 (set hide="'")
IF /i "!hide!"1==""1 (set hide="'")
:: В шаблоне, для Linux указано .* и ^$ если не изменено меняем на . 
IF /I [%filtr%]==[".*"] (set filtr=".")
IF /I [%hide%]==["^$"] (set hide="'")

:: Преобразуем переменные фильтров
set filtr=%filtr:\|=";"%
for %%a in (%filtr%) do set filtre=!filtre!/c:%%a 
set filtr=%filtre%

set hide=%hide:\|=";"%
for %%b in (%hide%) do set hidep=!hidep!/c:%%b 
set hide=%hidep%

:: Проверка входных переменных
::echo %date% %time% %pcname% %port% %way% %filtr% %hide% %kodr% >> filetraplog.txt

:: Указываем IP или DNS Заббикс сервера, по умолчанию должно работать localhost так как скрипт находится на самом сервере заббикс.
set IPZBXSERVER=192.168.175.111

:: Так как элементы данных у нас обнаруживаются с обычным слешем /, а для выполнения команд нам нужен обратный слешь \ , разворачиваем.
::set way=%way:/=\%
::set way="C:\Users\14-1;C:\Program Files (x86);C:\Users\All Users"
:: Экранируем пути добавляем кавычки было ; стало ";"
set way=%way:;=";"%
:: Разбор входных директорий, если их несколько
for %%a in (%way%) do (
:: Запрос содержание данной директории (накопительная переменная) + фильтрация
for /f "tokens=1 delims=" %%b in ('dir /a-d /B %%a\ 2^>nul^|findstr/irv /c:"^$"^|findstr/ir %filtr%^|findstr/irv %hide%') do set puti=!puti!%%a\%%b;
)
:: Уберем последнюю ; так как она потом создает пустую переменную "" которая выполняет команду для текущей директории.
set puti=%puti:~0,-1%
:: Убираем все кавычки
set puti=%puti:"=%
:: Заново экранируем строку путь
set puti="%puti:;=";"%"
::echo %puti%
:: Разбор по адресам (путям)
::for %%c in (%puti%) do set filename=%%c & call:size
for %%c in (%puti%) do IF /I %%c1 NEQ ""1 ( set filename=%%c & call:size) ELSE ( goto :otpravka)
goto :otpravka

:size
:: Наличие файла
IF EXIST %filename% (set exists=1) ELSE (set exists=0)
:: Получаем размер директории в байтах (слово файлов в cp1251 "д c<Rў" cp866 "д c<Rў" зависит от текущей кодировки скрипта)
::for /f "tokens=1-3" %%d in ('2^>nul Dir %filename% /-C /S /A:-D^|find /I "файлов"') Do Set sizefile=%%f
for %%k in (%filename%) do Set sizefile=%%~zk
:: Время изменения файла (модификация последней операции записи)
::for /f "tokens=1-5 delims=.: " %%j in ('2^>nul Dir %filename% /T:W^|findstr /rc:"[0-9]\..*"') do set timemodify=%%l.%%k.%%j %%m:%%n
for %%i in (%filename%) do set timemodify=%%~ti
:: Время изменения свойств файла (время создания)
for /f "tokens=1-5 delims=.: " %%j in ('2^>nul Dir %filename% /T:C^|findstr /rc:"^[^ ]"') do set timechange=%%l.%%k.%%j %%m:%%n
:: Время последнего доступа (Последнее использование, последний доступ)
for /f "tokens=1-5 delims=.: " %%j in ('2^>nul Dir %filename% /T:A^|findstr /rc:"[0-9]\..*"') do set timeaccess=%%l.%%k.%%j %%m:%%n
:: Разворачиваем слеши, для совпадения ключей на заббик сервере и правильной работе регулярного выражения
::set filename=%filename:\=/%
:: Вывод поочередно и отправка траппетом для каждого файла отдельно. (вместо set JSON=!JSON!%FileNS%) не поддерживает русские имена папок
:: Отправка данных Наличие файла
::zabbix_sender -z %IPZBXSERVER% -p %port% -s "%pcname%" -k trapexists[\"%filename%\"] -o "%exists%"
:: Отправка данных Размер файла
::zabbix_sender -z %IPZBXSERVER% -p %port% -s "%pcname%" -k trapsizefile[\"%filename%\"] -o "%sizefile%"
:: Отправка данных Время изменения файла
::zabbix_sender -z %IPZBXSERVER% -p %port% -s "%pcname%" -k trapstimemodify[\"%filename%\"] -o "%timemodify%"
:: Отправка данных Время изменения свойств файла
::zabbix_sender -z %IPZBXSERVER% -p %port% -s "%pcname%" -k trapstimechange[\"%filename%\"] -o "%timechange%"
:: Отправка данных Время последнего доступа
::zabbix_sender -z %IPZBXSERVER% -p %port% -s %pcname% -k trapstimeaccess[\"%filename%\"] -o "%timeaccess%"
set FileNS=%filename% exists:%exists% sizefile:%sizefile% timemodify:%timemodify% timechange:%timechange% timeaccess:%timeaccess%\n
::echo FileNS=%filename% exists:%exists% sizefile:%sizefile% timemodify:%timemodify% timechange:%timechange% timeaccess:%timeaccess%\n

:: Очистка переменных, от случайного попадания предыдущего значения
set exists=
Set sizefile=
set timemodify=
set timechange=
set timeaccess=

set JSON=!JSON!%FileNS%
:: Убираем все кавычки
set JSON=%JSON:"=%
goto :end

:otpravka
:: Меняем кодировку через файл так как Zabbix sender принимает строки в UTF-8 кодировке
:: Определение текущей кодировки может отличатся 866 и 1251
for /f "tokens=2 delims=:" %%s in ('chcp') do set "kodstr=%%s"
:: Вывод в кодировке UTF-8 (Zabbix sender принимает строки в UTF-8 кодировке (BOM))
chcp 65001 > nul
:: Вывод одним списком для всех файлов и отправка в виде Лога
echo "%JSON%" >> "%~dp0SIZEFILE.TXT"
:: Cкрыть временный файл
::copy /b NUL "%~dp0SIZEDIR.TXT"
attrib +h "%~dp0SIZEFILE.TXT"
:: Кодировка 1251
chcp 1251 > nul
:: Читаем перекодированный файл и выводим в переменную
for /f "usebackq tokens=*" %%t in ("%~dp0SIZEFILE.TXT") do set JSON=%%t
zabbix_sender.exe -z %IPZBXSERVER% -p %port% -s "%pcname%" -k filelogwin -o %JSON%
:: Удаление файла
del /F /Q /A:H "%~dp0SIZEFILE.TXT"
:: Возврат кодировки
chcp %kodstr:~1% > nul
setlocal DISABLEDELAYEDEXPANSION
:end
Для кодировки в формате 1251 в целом все алогично
dir-file-trapper-win-cp1251-File.bat
Показать
Кодировка cp1251
cp1251
cp1251

Код: Выделить всё

@echo off
mode con:cols=130 lines=1000
color 1a
:: Автор Мамзиков Артём Андреевич
:: V 5.0 22.11.2021
TITLE dir-file-trapper-win

setlocal enabledelayedexpansion
:: Входные переменные %1 - имя узла, 2% - Порт активный, %3 - путь сканируемой директории, 4% - что показать, 5% - что скрыть, 6% - кодировка
set pcname=%1
set port=%2
set way=%3
set filtr=%4
set hide=%5
::set kodr=%6

:: Если переменная пустая (в кавычках "" и без) пропишем стандартные данные
IF /i %filtr%1==""1 (set filtr=".")
IF /i "!filtr!"1==""1 (set filtr=".")
IF /i %hide%1==""1 (set hide="'")
IF /i "!hide!"1==""1 (set hide="'")
:: В шаблоне, для Linux указано .* и ^$ если не изменено меняем на . 
IF /I [%filtr%]==[".*"] (set filtr=".")
IF /I [%hide%]==["^$"] (set hide="'")

:: Преобразуем переменные фильтров
set filtr=%filtr:\|=";"%
for %%a in (%filtr%) do set filtre=!filtre!/c:%%a 
set filtr=%filtre%

set hide=%hide:\|=";"%
for %%b in (%hide%) do set hidep=!hidep!/c:%%b 
set hide=%hidep%

:: Проверка входных переменных
::echo %date% %time% %pcname% %port% %way% %filtr% %hide% %kodr% >> filetraplog.txt

:: Указываем IP или DNS Заббикс сервера, по умолчанию должно работать localhost так как скрипт находится на самом сервере заббикс.
set IPZBXSERVER=192.168.175.111

:: Так как элементы данных у нас обнаруживаются с обычным слешем /, а для выполнения команд нам нужен обратный слешь \ , разворачиваем.
::set way=%way:/=\%
::set way="C:\Users\14-1;C:\Program Files (x86);C:\Users\All Users"
:: Экранируем пути добавляем кавычки было ; стало ";"
set way=%way:;=";"%
:: Разбор входных директорий, если их нексколько
for %%a in (%way%) do (
:: Запрос содержание данной директории (накопительная переменная) + фильтрация
for /f "tokens=1 delims=" %%b in ('dir /a-d /B %%a\ 2^>nul^|findstr/ir %filtr%^|findstr/irv %hide%') do set puti=!puti!%%a\%%b;
)
:: Уберем последнюю ; так как она потом создает пустую переменную "" которая выполняет команду для текущей директории.
set puti=%puti:~0,-1%
:: Убираем все кавычки
set puti=%puti:"=%
:: Заново экранируем строку путь
set puti="%puti:;=";"%"
::echo %puti%
:: Разбор по адресам (путям)
for %%c in (%puti%) do set filename=%%c& call:size

:: Меняем кодировку через файл так как Zabbix sender принимает строки в UTF-8 кодировке
:: Определение текущей кодировки может отличатся 866 и 1251
for /f "tokens=2 delims=:" %%s in ('chcp') do set "kodstr=%%s"
:: Вывод в кодировке UTF-8 (Zabbix sender принимает строки в UTF-8 кодировке (BOM))
chcp 65001 > nul
:: Вывод одним списком для всех файлов и отправка в виде Лога
echo "%JSON%" >> "%~dp0SIZEFILE.TXT"
:: Cкрыть временный файл
::copy /b NUL "%~dp0SIZEDIR.TXT"
attrib +h "%~dp0SIZEFILE.TXT"
:: Кодировка 1251
chcp 1251 > nul
:: Читаем перекодированный файл и выводим в переменную
for /f "usebackq tokens=*" %%t in ("%~dp0SIZEFILE.TXT") do set JSON=%%t
zabbix_sender.exe -z %IPZBXSERVER% -p %port% -s "%pcname%" -k filelogwin -o %JSON%
:: Удаление файла
del /F /Q /A:H "%~dp0SIZEFILE.TXT"
:: Возврат кодировки
chcp %kodstr:~1% > nul
:end

:size
:: Наличие файла
IF EXIST %filename% (set exists=1) ELSE (set exists=0)
:: Получаем размер директории в байтах (слово файлов в cp1251 "д c<Rў" cp866 "д c<Rў" зависит оттекущей кодировки скрипта)
::for /f "tokens=1-3" %%d in ('2^>nul Dir %filename% /-C /S /A:-D^|find /I "д ©«®ў"') Do Set sizefile=%%f
for %%k in (%filename%) do Set sizefile=%%~zk
:: Время изменения файла (модификация последней операции записи)
::for /f "tokens=1-5 delims=.: " %%j in ('2^>nul Dir %filename% /T:W^|findstr /rc:"[0-9]\..*"') do set timemodify=%%l.%%k.%%j %%m:%%n
for %%i in (%filename%) do set timemodify=%%~ti
:: Время изменения свойств файла (время создания)
for /f "tokens=1-5 delims=.: " %%j in ('2^>nul Dir %filename% /T:C^|findstr /rc:"^[^ ]"') do set timechange=%%l.%%k.%%j %%m:%%n
:: Время последнего доступа (Последнее использование, последний доступ)
for /f "tokens=1-5 delims=.: " %%j in ('2^>nul Dir %filename% /T:A^|findstr /rc:"[0-9]\..*"') do set timeaccess=%%l.%%k.%%j %%m:%%n
:: Разворачиваем слеши, для совпадения ключей на заббик сервере и правильной работе регулярного выражения
::set filename=%filename:\=/%
:: Вывод по очередно и отправка траппетом для каждого файла отдельно. (вместо set JSON=!JSON!%FileNS%) не поддерживает русские имена папок
:: Отправка данных Наличие файла
::zabbix_sender -z %IPZBXSERVER% -p %port% -s "%pcname%" -k trapexists[\"%filename%\"] -o "%exists%"
:: Отправка данных Размер файла
::zabbix_sender -z %IPZBXSERVER% -p %port% -s "%pcname%" -k trapsizefile[\"%filename%\"] -o "%sizefile%"
:: Отправка данных Время изменения файла
::zabbix_sender -z %IPZBXSERVER% -p %port% -s "%pcname%" -k trapstimemodify[\"%filename%\"] -o "%timemodify%"
:: Отправка данных Время изменения свойств файла
::zabbix_sender -z %IPZBXSERVER% -p %port% -s "%pcname%" -k trapstimechange[\"%filename%\"] -o "%timechange%"
:: Отправка данных Время последнего доступа
::zabbix_sender -z %IPZBXSERVER% -p %port% -s "%pcname%" -k trapstimeaccess[\"%filename%\"] -o "%timeaccess%"

set FileNS=%filename% exists:%exists% sizefile:%sizefile% timemodify:%timemodify% timechange:%timechange% timeaccess:%timeaccess%\n
::echo FileNS=%filename% exists:%exists% sizefile:%sizefile% timemodify:%timemodify% timechange:%timechange% timeaccess:%timeaccess%\n

:: Очистка переменных, от случайного попадания предыдущего значения
set exists=
Set sizefile=
set timemodify=
set timechange=
set timeaccess=

set JSON=!JSON!%FileNS%
:: Убираем все кавычки
set JSON=%JSON:"=%
setlocal DISABLEDELAYEDEXPANSION
Для 2 способа в скрипте раскомментировать строки

Код: Выделить всё

:: Вывод поочередно и отправка траппетом для каждого файла отдельно. (вместо set JSON=!JSON!%FileNS%) не поддерживает русские имена папок
:: Отправка данных Наличие файла
zabbix_sender -z %IPZBXSERVER% -p %port% -s "%pcname%" -k trapexists[\"%filename%\"] -o "%exists%"
:: Отправка данных Размер файла
zabbix_sender -z %IPZBXSERVER% -p %port% -s "%pcname%" -k trapsizefile[\"%filename%\"] -o "%sizefile%"
:: Отправка данных Время изменения файла
zabbix_sender -z %IPZBXSERVER% -p %port% -s "%pcname%" -k trapstimemodify[\"%filename%\"] -o "%timemodify%"
:: Отправка данных Время изменения свойств файла
zabbix_sender -z %IPZBXSERVER% -p %port% -s "%pcname%" -k trapstimechange[\"%filename%\"] -o "%timechange%"
:: Отправка данных Время последнего доступа
zabbix_sender -z %IPZBXSERVER% -p %port% -s %pcname% -k trapstimeaccess[\"%filename%\"] -o "%timeaccess%"
Если нигде не требуется логом 3 способ можно закомментировать данную строку

Код: Выделить всё

::zabbix_sender.exe -z %IPZBXSERVER% -p %port% -s "%pcname%" -k filelogwin -o %JSON%
Запуск скрипта происходит через элемента данных в заббиксе доступна 2 способа, так же можно указать скрипт в планировщик заданий с входными данными или указать в самом скрипте переменные.

Для запроса большого количества файлов или всех подкаталогов с параметром /S возникает ошибка в длинной строке в переменую.
Есть несколько вариантов скриптов, через файл и изменённый синтаксис команд.
Более подробно в 4 сообщении
Команда проверки пример:
dir-file-trapper-win-cp866-FileV-6.2.bat "hostname" "10051" "C:\Program Files (x86);C:\Users\All Users"

Через файл для обхода ограничения памяти переменной dir-file-trapper-win-cp866-FileV-6.2.bat

Код: Выделить всё

@echo off
mode con:cols=130 lines=1000
color 1a
:: Автор Мамзиков Артём Андреевич
:: V 6.2 05.05.2022
TITLE dir-file-trapper-win

setlocal enabledelayedexpansion
:: Входные переменные %1 - имя узла, 2% - Порт активный, %3 - путь сканируемой директории, 4% - что показать, 5% - что скрыть, 6% - кодировка
set pcname=%1
set port=%2
set way=%3
set filtr=%4
set hide=%5
::set kodr=%6

:: Если переменная пустая (в кавычках "" и без) пропишем стандартные данные
IF /i %filtr%1==""1 (set filtr=".")
IF /i "!filtr!"1==""1 (set filtr=".")
IF /i %hide%1==""1 (set hide="'")
IF /i "!hide!"1==""1 (set hide="'")
:: В шаблоне, для Linux указано .* и ^$ если не изменено меняем на . 
IF /I [%filtr%]==[".*"] (set filtr=".")
IF /I [%hide%]==["^$"] (set hide="'")

:: Преобразуем переменные фильтров
set filtr=%filtr:\|=";"%
for %%a in (%filtr%) do set filtre=!filtre!/c:%%a 
set filtr=%filtre%

set hide=%hide:\|=";"%
for %%b in (%hide%) do set hidep=!hidep!/c:%%b 
set hide=%hidep%

:: Проверка входных переменных
::echo %date% %time% %pcname% %port% %way% %filtr% %hide% %kodr% >> filetraplog.txt

:: Указываем IP или DNS Заббикс сервера, по умолчанию должно работать localhost так как скрипт находится на самом сервере заббикс.
set IPZBXSERVER=192.168.175.111

:: Удаление старого списка файлов
del /F /Q "%~dp0SPISOKFILE.TXT"

:: Так как элементы данных у нас обнаруживаются с обычным слешем /, а для выполнения команд нам нужен обратный слеш \ , разворачиваем.
::set way=%way:/=\%
::set way="C:\Program Files (x86);C:\Users\All Users"
:: Экранируем пути добавляем кавычки было ; стало ";"
set way=%way:;=";"%
:: Разбор входных директорий, если их несколько
for %%a in (%way%) do IF /I %%a1 NEQ ""1 (
:: Запрос содержание данной директории (накопительная переменная) + фильтрация, Разбор по адресам (путям)
dir /a-d /B %%a\ 2>nul|findstr/irv /c:"^$"|findstr/ir %filtr%|findstr/irv %hide%>> "%~dp0SPISOKFILE.TXT"
for /f "usebackq tokens=1 delims=" %%b in ("%~dp0SPISOKFILE.TXT") do IF /I "%%b1" NEQ "1" ( set filename=%%a\"%%b"& call:size) ELSE (echo Пустая переменая1)) ELSE (echo Пустая переменая2)

:: Запрос содержание данной директории и ПОДКАТАЛОГОВ (ЧЕРЕЗ ФАЙЛ) + фильтрация, Разбор по адресам (путям)
::dir /a-d /B /S %%a\ 2>nul|findstr/irv /c:"^$"|findstr/ir %filtr%|findstr/irv %hide%>> "%~dp0SPISOKFILE.TXT"
::for /f "usebackq tokens=1 delims=" %%b in ("%~dp0SPISOKFILE.TXT") do IF /I "%%b1" NEQ "1" ( set filename="%%b"& call:size) ELSE (echo Пустая переменая1)) ELSE (echo Пустая переменая2)

:: Запрос содержание данной директории и ПОДКАТАЛОГОВ (накопительная переменная) + фильтрация, Разбор по адресам (путям)
::dir /a-d /B /S %%a\ 2>nul|findstr/irv /c:"^$"|findstr/ir %filtr%|findstr/irv %hide%>> "%~dp0SPISOKFILE.TXT") ELSE (echo Пустая переменая1)
::for /f "usebackq tokens=1 delims=" %%b in ("%~dp0SPISOKFILE.TXT") do IF /I "%%b1" NEQ "1" ( set filename="%%b"& call:size) ELSE (echo Пустая переменая2)
:: ИЛИ ВОЗМОЖНО ТАК c ^ работает на win server 2008, на win-10 не работает (Недопустимый ключ i v)
::dir /a-d /B /S %%a\ 2^>nul^|findstr/irv /C:"^$"^|findstr/ir %filtr%^|findstr/irv %hide%>> "%~dp0SPISOKFILE.TXT"
::for /f "usebackq tokens=1 delims=" %%b in ("%~dp0SPISOKFILE.TXT") do IF /I "%%b1" NEQ "1" ( set filename="%%b"& call:size) ELSE (echo Пустая переменая2)) ELSE (echo Пустая переменая1)

:: Запрос содержание данной директории (накопительная переменная) + фильтрация, Разбор по адресам (путям)
::for /f "tokens=1 delims=" %%b in ('dir /a-d /B %%a\ 2^>nul^|findstr/irv /c:"^$"^|findstr/ir %filtr%^|findstr/irv %hide%') do IF /I "%%b1" NEQ "1" ( set filename=%%a\"%%b"& call:size) ELSE (echo Пустая переменая2)) ELSE (echo Пустая переменая1)
:: Если нужны ПОДКАТАЛОГИ использовать
::for /f "tokens=1 delims=" %%b in ('dir /a-d /B /S %%a\ 2^>nul^|findstr/irv /c:"^$"^|findstr/ir %filtr%^|findstr/irv %hide%') do IF /I "%%b1" NEQ "1" ( set filename="%%b"& call:size) ELSE (echo Пустая переменая2)) ELSE (echo Пустая переменая1)


:: Кодировка 1251
chcp 1251 > nul
:: Читаем перекодированный файл и выводим в переменную
for /f "usebackq tokens=*" %%t in ("%~dp0SIZEFILE.TXT") do set JSON=%%t
zabbix_sender.exe -z %IPZBXSERVER% -p %port% -s "%pcname%" -k filelogwin -o %JSON%
::echo "%JSON%"
:: Удаление файла
del /F /Q /A:H "%~dp0SIZEFILE.TXT"
del /F /Q "%~dp0SPISOKFILE.TXT"
:: Возврат кодировки
chcp %kodstr:~1% > nul
:end

:size
:: Уберем лишние кавычки "\" для dir /a-d /B если используется dir /a-d /B /S можно закомментировать!
set filename=%filename:"\"=\%
:: Наличие файла
IF EXIST %filename% (set exists=1) ELSE (set exists=0)
:: Получаем размер директории в байтах (слово файлов в cp1251 "д c<Rў" cp866 "д c<Rў" зависит от текущей кодировки скрипта)
::for /f "tokens=1-3" %%d in ('2^>nul Dir %filename% /-C /S /A:-D^|find /I "файлов"') Do Set sizefile=%%f
for %%k in (%filename%) do Set sizefile=%%~zk
:: Время изменения файла (модификация последней операции записи)
::for /f "tokens=1-5 delims=.: " %%j in ('2^>nul Dir %filename% /T:W^|findstr /rc:"[0-9]\..*"') do set timemodify=%%l.%%k.%%j %%m:%%n
for %%i in (%filename%) do set timemodify=%%~ti
:: Время изменения свойств файла (время создания)
for /f "tokens=1-5 delims=.: " %%j in ('2^>nul Dir %filename% /T:C^|findstr /rc:"^[^ ]"') do set timechange=%%l.%%k.%%j %%m:%%n
:: Время последнего доступа (Последнее использование, последний доступ)
for /f "tokens=1-5 delims=.: " %%j in ('2^>nul Dir %filename% /T:A^|findstr /rc:"[0-9]\..*"') do set timeaccess=%%l.%%k.%%j %%m:%%n
:: Разворачиваем слеши, для совпадения ключей на заббик сервере и правильной работе регулярного выражения
::set filename=%filename:\=/%
:: Вывод по очередно и отправка траппетом для каждого файла отдельно. (вместо set JSON=!JSON!%FileNS%) не поддерживает русские имена папок
:: Отправка данных Наличие файла
::zabbix_sender -z %IPZBXSERVER% -p %port% -s "%pcname%" -k trapexists[\"%filename%\"] -o "%exists%"
:: Отправка данных Размер файла
::zabbix_sender -z %IPZBXSERVER% -p %port% -s "%pcname%" -k trapsizefile[\"%filename%\"] -o "%sizefile%"
:: Отправка данных Время изменения файла
::zabbix_sender -z %IPZBXSERVER% -p %port% -s "%pcname%" -k trapstimemodify[\"%filename%\"] -o "%timemodify%"
:: Отправка данных Время изменения свойств файла
::zabbix_sender -z %IPZBXSERVER% -p %port% -s "%pcname%" -k trapstimechange[\"%filename%\"] -o "%timechange%"
:: Отправка данных Время последнего доступа
::zabbix_sender -z %IPZBXSERVER% -p %port% -s "%pcname%" -k trapstimeaccess[\"%filename%\"] -o "%timeaccess%"

set FileNS=%filename% exists:%exists% sizefile:%sizefile% timemodify:%timemodify% timechange:%timechange% timeaccess:%timeaccess%\n
::echo FileNS=%filename% exists:%exists% sizefile:%sizefile% timemodify:%timemodify% timechange:%timechange% timeaccess:%timeaccess%\n

:: Очистка переменных, от случайного попадания предыдущего значения
set exists=
Set sizefile=
set timemodify=
set timechange=
set timeaccess=

:: Убираем все кавычки
set JSON=%FileNS:"=%
:: Меняем кодировку через файл так как Zabbix sender принимает строки в UTF-8 кодировке
:: Определение текущей кодировки может отличатся 866 и 1251
for /f "tokens=2 delims=:" %%s in ('chcp') do set "kodstr=%%s"
:: Вывод в кодировке UTF-8 (Zabbix sender принимает строки в UTF-8 кодировке (BOM))
chcp 65001 > nul
:: Вывод одним списком для всех файлов и отправка в виде Лога
echo "%JSON%" >> "%~dp0SIZEFILE.TXT"
:: Cкрыть временный файл
::copy /b NUL "%~dp0SIZEDIR.TXT"
attrib +h "%~dp0SIZEFILE.TXT"

::set JSON=!JSON!%FileNS%
:: Убираем все кавычки
::set JSON=%JSON:"=%
setlocal DISABLEDELAYEDEXPANSION
СКАЧАТЬ
dir-file-trapper-win-cp866-FileV-6.2.zip
dir-file-trapper-win-cp866-FileV-6.2.zip
(2.79 КБ) 23 скачивания
dir-file-trapper-win-cp866-FileV-6.1.bat
Отличие от 5 версии все в одной команде

Код: Выделить всё

dir /a-d /B %%a\ 2>nul|findstr/irv /c:"^$"|findstr/ir %filtr%|findstr/irv %hide%>> "%~dp0SPISOKFILE.TXT"
for /f "usebackq tokens=1 delims=" %%b in ("%~dp0SPISOKFILE.TXT") do IF /I "%%b1" NEQ "1" ( set filename=%%a\"%%b"& call:size) ELSE (echo Пустая переменая1)) ELSE (echo Пустая переменая2)
Сам скрипт

Код: Выделить всё

@echo off
mode con:cols=130 lines=1000
color 1a
:: Автор Мамзиков Артём Андреевич
:: V 6.1 05.05.2022
TITLE dir-file-trapper-win

setlocal enabledelayedexpansion
:: Входные переменные %1 - имя узла, 2% - Порт активный, %3 - путь сканируемой директории, 4% - что показать, 5% - что скрыть, 6% - кодировка
set pcname=%1
set port=%2
set way=%3
set filtr=%4
set hide=%5
::set kodr=%6

:: Если переменная пустая (в кавычках "" и без) пропишем стандартные данные
IF /i %filtr%1==""1 (set filtr=".")
IF /i "!filtr!"1==""1 (set filtr=".")
IF /i %hide%1==""1 (set hide="'")
IF /i "!hide!"1==""1 (set hide="'")
:: В шаблоне, для Linux указано .* и ^$ если не изменено меняем на . 
IF /I [%filtr%]==[".*"] (set filtr=".")
IF /I [%hide%]==["^$"] (set hide="'")

:: Преобразуем переменные фильтров
set filtr=%filtr:\|=";"%
for %%a in (%filtr%) do set filtre=!filtre!/c:%%a 
set filtr=%filtre%

set hide=%hide:\|=";"%
for %%b in (%hide%) do set hidep=!hidep!/c:%%b 
set hide=%hidep%

:: Проверка входных переменных
::echo %date% %time% %pcname% %port% %way% %filtr% %hide% %kodr% >> filetraplog.txt

:: Указывем IP или DNS Заббикс сервера, по умолчанию должно работать localhost так как скрипт находится на самом сервере заббикс.
set IPZBXSERVER=192.168.175.111

:: Удаление старого списка файлов
del /F /Q "%~dp0SPISOKFILE.TXT"

:: Так как элементы данных у нас обнаруживаются с обычным слешем /, а для выполнения команд нам нужен обратный слешь \ , разворачиваем.
::set way=%way:/=\%
::set way="C:\Program Files (x86);C:\Users\All Users"
:: Экранируем пути добавляем кавычки было ; стало ";"
set way=%way:;=";"%
:: Разбор входных директорий, если их нексколько
for %%a in (%way%) do IF /I %%a1 NEQ ""1 (
:: Запрос содержание данной директории (накопительная переменная) + фильтрация, Разбор по адресам (путям)
dir /a-d /B %%a\ 2>nul|findstr/irv /c:"^$"|findstr/ir %filtr%|findstr/irv %hide%>> "%~dp0SPISOKFILE.TXT"
for /f "usebackq tokens=1 delims=" %%b in ("%~dp0SPISOKFILE.TXT") do IF /I "%%b1" NEQ "1" ( set filename=%%a\"%%b"& call:size) ELSE (echo Пустая переменая1)) ELSE (echo Пустая переменая2)

:: Запрос содержание данной директории и ПОДКАТАЛОГОВ (ЧЕРЕЗ ФАЙЛ) + фильтрация, Разбор по адресам (путям)
::dir /a-d /B /S %%a\ 2>nul|findstr/irv /c:"^$"|findstr/ir %filtr%|findstr/irv %hide%>> "%~dp0SPISOKFILE.TXT"
::for /f "usebackq tokens=1 delims=" %%b in ("%~dp0SPISOKFILE.TXT") do IF /I "%%b1" NEQ "1" ( set filename="%%b"& call:size) ELSE (echo Пустая переменая1)) ELSE (echo Пустая переменая2)

:: Запрос содержание данной директории и ПОДКАТАЛОГОВ (накопительная переменная) + фильтрация, Разбор по адресам (путям)
::dir /a-d /B /S %%a\ 2>nul|findstr/irv /c:"^$"|findstr/ir %filtr%|findstr/irv %hide%>> "%~dp0SPISOKFILE.TXT") ELSE (echo Пустая переменая1)
::for /f "usebackq tokens=1 delims=" %%b in ("%~dp0SPISOKFILE.TXT") do IF /I "%%b1" NEQ "1" ( set filename="%%b"& call:size) ELSE (echo Пустая переменая2)
:: ИЛИ ВОЗМОЖНО ТАК c ^ работает на win server 2008, на win-10 не работает (Недопустимый ключ i v)
::dir /a-d /B /S %%a\ 2^>nul^|findstr/irv /C:"^$"^|findstr/ir %filtr%^|findstr/irv %hide%>> "%~dp0SPISOKFILE.TXT"
::for /f "usebackq tokens=1 delims=" %%b in ("%~dp0SPISOKFILE.TXT") do IF /I "%%b1" NEQ "1" ( set filename="%%b"& call:size) ELSE (echo Пустая переменая2)) ELSE (echo Пустая переменая1)

:: Запрос содержание данной директории (накопительная переменная) + фильтрация, Разбор по адресам (путям)
::for /f "tokens=1 delims=" %%b in ('dir /a-d /B %%a\ 2^>nul^|findstr/irv /c:"^$"^|findstr/ir %filtr%^|findstr/irv %hide%') do IF /I "%%b1" NEQ "1" ( set filename=%%a\"%%b"& call:size) ELSE (echo Пустая переменая2)) ELSE (echo Пустая переменая1)
:: Если нужны ПОДКАТАЛОГИ использовать
::for /f "tokens=1 delims=" %%b in ('dir /a-d /B /S %%a\ 2^>nul^|findstr/irv /c:"^$"^|findstr/ir %filtr%^|findstr/irv %hide%') do IF /I "%%b1" NEQ "1" ( set filename="%%b"& call:size) ELSE (echo Пустая переменая2)) ELSE (echo Пустая переменая1)

::echo "%JSON%"
:: Меняем кодировку через файл так как Zabbix sender принимает строки в UTF-8 кодировке
:: Определение текущей кодировки может отличатся 866 и 1251
for /f "tokens=2 delims=:" %%s in ('chcp') do set "kodstr=%%s"
:: Вывод в кодировке UTF-8 (Zabbix sender принимает строки в UTF-8 кодировке (BOM))
chcp 65001 > nul
:: Вывод одним списком для всех файлов и отправка в виде Лога
echo "%JSON%" >> "%~dp0SIZEFILE.TXT"
:: Cкрыть временный файл
::copy /b NUL "%~dp0SIZEDIR.TXT"
attrib +h "%~dp0SIZEFILE.TXT"
:: Кодировка 1251
chcp 1251 > nul
:: Читаем перекодированный файл и выводим в переменную
for /f "usebackq tokens=*" %%t in ("%~dp0SIZEFILE.TXT") do set JSON=%%t
zabbix_sender.exe -z %IPZBXSERVER% -p %port% -s "%pcname%" -k filelogwin -o %JSON%
:: Удаление файла
del /F /Q /A:H "%~dp0SIZEFILE.TXT"
del /F /Q "%~dp0SPISOKFILE.TXT"
:: Возврат кодировки
chcp %kodstr:~1% > nul
:end

:size
:: Уберем лишние кавычки "\" для dir /a-d /B если используется dir /a-d /B /S можно закоментировать!
set filename=%filename:"\"=\%
:: Наличие файла
IF EXIST %filename% (set exists=1) ELSE (set exists=0)
:: Получаем размер директории в байтах (слово файлов в cp1251 "д c<Rў" cp866 "д c<Rў" зависит оттекущей кодировки скрипта)
::for /f "tokens=1-3" %%d in ('2^>nul Dir %filename% /-C /S /A:-D^|find /I "файлов"') Do Set sizefile=%%f
for %%k in (%filename%) do Set sizefile=%%~zk
:: Время изменения файла (модификация последней операции записи)
::for /f "tokens=1-5 delims=.: " %%j in ('2^>nul Dir %filename% /T:W^|findstr /rc:"[0-9]\..*"') do set timemodify=%%l.%%k.%%j %%m:%%n
for %%i in (%filename%) do set timemodify=%%~ti
:: Время изменения свойств файла (время создания)
for /f "tokens=1-5 delims=.: " %%j in ('2^>nul Dir %filename% /T:C^|findstr /rc:"^[^ ]"') do set timechange=%%l.%%k.%%j %%m:%%n
:: Время последнего доступа (Последнее использование, последний доступ)
for /f "tokens=1-5 delims=.: " %%j in ('2^>nul Dir %filename% /T:A^|findstr /rc:"[0-9]\..*"') do set timeaccess=%%l.%%k.%%j %%m:%%n
:: Разворачиваем слеши, для совпадения ключей на заббик сервере и правильной работе регулярного выражения
::set filename=%filename:\=/%
:: Вывод по очередно и отправка траппетом для каждого файла отдельно. (вместо set JSON=!JSON!%FileNS%) не поддерживает русские имена папок
:: Отправка данных Наличие файла
::zabbix_sender -z %IPZBXSERVER% -p %port% -s "%pcname%" -k trapexists[\"%filename%\"] -o "%exists%"
:: Отправка данных Размер файла
::zabbix_sender -z %IPZBXSERVER% -p %port% -s "%pcname%" -k trapsizefile[\"%filename%\"] -o "%sizefile%"
:: Отправка данных Время изменения файла
::zabbix_sender -z %IPZBXSERVER% -p %port% -s "%pcname%" -k trapstimemodify[\"%filename%\"] -o "%timemodify%"
:: Отправка данных Время изменения свойств файла
::zabbix_sender -z %IPZBXSERVER% -p %port% -s "%pcname%" -k trapstimechange[\"%filename%\"] -o "%timechange%"
:: Отправка данных Время последнего доступа
::zabbix_sender -z %IPZBXSERVER% -p %port% -s "%pcname%" -k trapstimeaccess[\"%filename%\"] -o "%timeaccess%"

set FileNS=%filename% exists:%exists% sizefile:%sizefile% timemodify:%timemodify% timechange:%timechange% timeaccess:%timeaccess%\n
::echo FileNS=%filename% exists:%exists% sizefile:%sizefile% timemodify:%timemodify% timechange:%timechange% timeaccess:%timeaccess%\n

:: Очистка переменных, от случайного попадания предыдущего значения
set exists=
Set sizefile=
set timemodify=
set timechange=
set timeaccess=

set JSON=!JSON!%FileNS%
:: Убираем все кавычки
set JSON=%JSON:"=%
setlocal DISABLEDELAYEDEXPANSION
Скачать
dir-file-trapper-win-cp866-FileV-6.1.zip
dir-file-trapper-win-cp866-FileV-6.1.zip
(2.78 КБ) 19 скачиваний
dir-file-trapper-win-cp866-FileV-6.0.bat

Код: Выделить всё

@echo off
mode con:cols=130 lines=1000
color 1a
:: Автор Мамзиков Артём Андреевич
:: V 6.0 30.04.2022
TITLE dir-file-trapper-win

setlocal enabledelayedexpansion
:: Входные переменные %1 - имя узла, 2% - Порт активный, %3 - путь сканируемой директории, 4% - что показать, 5% - что скрыть, 6% - кодировка
set pcname=%1
set port=%2
set way=%3
set filtr=%4
set hide=%5
::set kodr=%6

:: Если переменная пустая (в кавычках "" и без) пропишем стандартные данные
IF /i %filtr%1==""1 (set filtr=".")
IF /i "!filtr!"1==""1 (set filtr=".")
IF /i %hide%1==""1 (set hide="'")
IF /i "!hide!"1==""1 (set hide="'")
:: В шаблоне, для Linux указано .* и ^$ если не изменено меняем на . 
IF /I [%filtr%]==[".*"] (set filtr=".")
IF /I [%hide%]==["^$"] (set hide="'")

:: Преобразуем переменные фильтров
set filtr=%filtr:\|=";"%
for %%a in (%filtr%) do set filtre=!filtre!/c:%%a 
set filtr=%filtre%

set hide=%hide:\|=";"%
for %%b in (%hide%) do set hidep=!hidep!/c:%%b 
set hide=%hidep%

:: Проверка входных переменных
::echo %date% %time% %pcname% %port% %way% %filtr% %hide% %kodr% >> filetraplog.txt

:: Указывем IP или DNS Заббикс сервера, по умолчанию должно работать localhost так как скрипт находится на самом сервере заббикс.
set IPZBXSERVER=192.168.175.111

:: Так как элементы данных у нас обнаруживаются с обычным слешем /, а для выполнения команд нам нужен обратный слешь \ , разворачиваем.
::set way=%way:/=\%
::set way="C:\Users\14-1;C:\Program Files (x86);C:\Users\All Users"
:: Экранируем пути добавляем кавычки было ; стало ";"
set way=%way:;=";"%
:: Разбор входных директорий, если их нексколько
for %%a in (%way%) do IF /I %%a1 NEQ ""1 (
:: Запрос содержание данной директории (накопительная переменная) + фильтрация, Разбор по адресам (путям)
for /f "tokens=1 delims=" %%b in ('dir /a-d /B %%a\ 2^>nul^|findstr/irv /c:"^$"^|findstr/ir %filtr%^|findstr/irv %hide%') do IF /I "%%b1" NEQ "1" ( set filename=%%a\"%%b"& call:size) ELSE (echo Пустая переменая2)) ELSE (echo Пустая переменая1)
:: Если нужны ПОДКАТАЛОГИ использовать , начало пути перменная %%a
::for /f "tokens=1 delims=" %%b in ('dir /a-d /B /S %%a\ 2^>nul^|findstr/irv /c:"^$"^|findstr/ir %filtr%^|findstr/irv %hide%') do IF /I "%%b1" NEQ "1" ( set filename="%%b"& call:size) ELSE (echo Пустая переменая2)) ELSE (echo Пустая переменая1)

::echo "%JSON%"
:: Меняем кодировку через файл так как Zabbix sender принимает строки в UTF-8 кодировке
:: Определение текущей кодировки может отличатся 866 и 1251
for /f "tokens=2 delims=:" %%s in ('chcp') do set "kodstr=%%s"
:: Вывод в кодировке UTF-8 (Zabbix sender принимает строки в UTF-8 кодировке (BOM))
chcp 65001 > nul
:: Вывод одним списком для всех файлов и отправка в виде Лога
echo "%JSON%" >> "%~dp0SIZEFILE.TXT"
:: Cкрыть временный файл
::copy /b NUL "%~dp0SIZEDIR.TXT"
attrib +h "%~dp0SIZEFILE.TXT"
:: Кодировка 1251
chcp 1251 > nul
:: Читаем перекодированный файл и выводим в переменную
for /f "usebackq tokens=*" %%t in ("%~dp0SIZEFILE.TXT") do set JSON=%%t
zabbix_sender.exe -z %IPZBXSERVER% -p %port% -s "%pcname%" -k filelogwin -o %JSON%
:: Удаление файла
del /F /Q /A:H "%~dp0SIZEFILE.TXT"
:: Возврат кодировки
chcp %kodstr:~1% > nul
:end

:size
:: Уберем лишние кавычки "\" для dir /a-d /B если используется dir /a-d /B /S можно закоментировать!
set filename=%filename:"\"=\%
:: Наличие файла
IF EXIST %filename% (set exists=1) ELSE (set exists=0)
:: Получаем размер директории в байтах (слово файлов в cp1251 "д c<Rў" cp866 "д c<Rў" зависит оттекущей кодировки скрипта)
::for /f "tokens=1-3" %%d in ('2^>nul Dir %filename% /-C /S /A:-D^|find /I "файлов"') Do Set sizefile=%%f
for %%k in (%filename%) do Set sizefile=%%~zk
:: Время изменения файла (модификация последней операции записи)
::for /f "tokens=1-5 delims=.: " %%j in ('2^>nul Dir %filename% /T:W^|findstr /rc:"[0-9]\..*"') do set timemodify=%%l.%%k.%%j %%m:%%n
for %%i in (%filename%) do set timemodify=%%~ti
:: Время изменения свойств файла (время создания)
for /f "tokens=1-5 delims=.: " %%j in ('2^>nul Dir %filename% /T:C^|findstr /rc:"^[^ ]"') do set timechange=%%l.%%k.%%j %%m:%%n
:: Время последнего доступа (Последнее использование, последний доступ)
for /f "tokens=1-5 delims=.: " %%j in ('2^>nul Dir %filename% /T:A^|findstr /rc:"[0-9]\..*"') do set timeaccess=%%l.%%k.%%j %%m:%%n
:: Разворачиваем слеши, для совпадения ключей на заббик сервере и правильной работе регулярного выражения
::set filename=%filename:\=/%
:: Вывод по очередно и отправка траппетом для каждого файла отдельно. (вместо set JSON=!JSON!%FileNS%) не поддерживает русские имена папок
:: Отправка данных Наличие файла
::zabbix_sender -z %IPZBXSERVER% -p %port% -s "%pcname%" -k trapexists[\"%filename%\"] -o "%exists%"
:: Отправка данных Размер файла
::zabbix_sender -z %IPZBXSERVER% -p %port% -s "%pcname%" -k trapsizefile[\"%filename%\"] -o "%sizefile%"
:: Отправка данных Время изменения файла
::zabbix_sender -z %IPZBXSERVER% -p %port% -s "%pcname%" -k trapstimemodify[\"%filename%\"] -o "%timemodify%"
:: Отправка данных Время изменения свойств файла
::zabbix_sender -z %IPZBXSERVER% -p %port% -s "%pcname%" -k trapstimechange[\"%filename%\"] -o "%timechange%"
:: Отправка данных Время последнего доступа
::zabbix_sender -z %IPZBXSERVER% -p %port% -s "%pcname%" -k trapstimeaccess[\"%filename%\"] -o "%timeaccess%"

set FileNS=%filename% exists:%exists% sizefile:%sizefile% timemodify:%timemodify% timechange:%timechange% timeaccess:%timeaccess%\n
::echo FileNS=%filename% exists:%exists% sizefile:%sizefile% timemodify:%timemodify% timechange:%timechange% timeaccess:%timeaccess%\n

:: Очистка переменных, от случайного попадания предыдущего значения
set exists=
Set sizefile=
set timemodify=
set timechange=
set timeaccess=

set JSON=!JSON!%FileNS%
:: Убираем все кавычки
set JSON=%JSON:"=%
setlocal DISABLEDELAYEDEXPANSION
Скачать
dir-file-trapper-win-cp866-FileV-6.0.zip
dir-file-trapper-win-cp866-FileV-6.0.zip
(2.59 КБ) 23 скачивания
Запуск удаленного скрипта обнаружение файлов, через заббикс агент или основной скрипт Windows
Запуск удаленного скрипта обнаружение файлов, через заббикс агент или основной скрипт Windows
Элемент данных для запуска скрипта на узле
Запуск удаленного скрипта обнаружение файлов, через заббикс агент Windows
Запуск удаленного скрипта обнаружение файлов, через заббикс агент Windows
Показать
Имя: Запуск удаленного скрипта обнаружение файлов, через заббикс агент Windows
Тип: Zabbix Агент
Ключ: system.run[{$SCRIPT.TRAPFILE} "{HOST.HOST}" "{$HOST.PORTSACTIV}" "{$PUTFILE}" "{$FILTRFILE}" "{$HIDEFILE}" "{$KODR}",nowait]
Тип информации: Числовой(целое положительное)
Интервал обновления: 6h
Группы элементов данных: Проверка файлов
Описание:
Запуск удаленного скрипта, через заббикс агент
Для получение данных о размере файлов через trapper
Вместо крона запуск со стороны заббикс сервера
Макросы с $ задать в узле
{$SCRIPT.TRAPFILE} - Путь где лежит скрипт на удаленном хосте (C:\zabbix\Scripts\dir-file-trapper-win-cp866-File.bat или dir-file-trapper-win-cp1251-File.bat)
Если порт не стандартный для отправки с Хоста на заббикс сервер -p 10051 , можно задать вручную в скрипте или назначить макрос
{HOST.HOST} - Имя узла сети (test)
{$HOST.PORTSACTIV} - Активный порт 10051
{$PATH.DIR} - Путь сканируемых Директорий (C:\Users\1;C:\Program Files (x86);C:\Users\All Users)
{$$FILTRFILE} - фильтр показать
{$HIDEFILE} - фильтр скрыть
{$KODR} - Windows кодировка cp866
Активировано:
Запуск удаленного скрипта обнаружение файлов, через заббикс агент Windows
Запуск удаленного скрипта обнаружение файлов, через заббикс агент Windows

Запуск удаленного скрипта обнаружение файлов, через основной Windows
Запуск удаленного скрипта обнаружение файлов, через основной Windows
Показать
Имя: Запуск удаленного скрипта обнаружение файлов, через основной Windows
Тип: Внешняя проверка
Ключ: size-file.sh[{HOST.CONN},{$HOST.PORTS},runscriptwin,'{$SCRIPT.TRAPFILE}','"{HOST.HOST}"','"{$HOST.PORTSACTIV}"','"{$PUTFILE}"','"{$FILTRFILE}"','"{$HIDEFILE}"','"{$KODR}"']
Тип информации: Текст
Интервал обновления: 6h
Период хранения истории: 90d
Группы элементов данных: Проверка файлов
Описание:
Запуск удаленного скрипта, через основной
Для получение данных о размере файлов через trapper
Вместо Планировщика заданий запуск со стороны заббикс сервера
Макросы с $ задать в узле
{HOST.CONN} - IP адрес или DNS имя узла сети (192.168.101.23)
{$HOST.PORTS} - Порт
runscriptwin - запускаемый блок в скрипте
{$SCRIPT.TRAPFILE} - Путь где лежит скрипт на удаленном хосте нужной кодировки без кавычек, не работает путь с пробелами ("C:\zabbix\Scripts\dir-file-trapper-win-cp866-File.bat")
{HOST.HOST} - Имя узла сети (test)
{$HOST.PORTSACTIV} - Активный порт 10051
{$PUTFILE} - Путь сканируемых директорий (C:\Users\14-1;C:\Program Files (x86);C:\Users\All Users)
{$FILTRFILE} - фильтр показать
{$HIDEFILE} - фильтр скрыть
{$KODR} - кодировка Windows cp866
Получаем команду
zabbix_get -s $IP -p $PORT -k system.run["$4 $5 $6 $7 $8 $9 ${10}",nowait]
Активировано:
Запуск удаленного скрипта обнаружение файлов, через основной Windows
Запуск удаленного скрипта обнаружение файлов, через основной Windows

3 Способ получение данных через trapper-Log
Похож на 2 способ, отличие в том что скрипт (тот же самый dir-file-trapper-win-cp866-File.bat) собирает данные и одним разом отправляет их в 1 элемент данных. Далее прототипы элементов данных Зависимы от основанного элемента куда пришли все данные, после предобработкой регулярным выражением разбираются данные.
Данная строка должны быть раскомментирована

Код: Выделить всё

zabbix_sender.exe -z %IPZBXSERVER% -p %port% -s "%pcname%" -k filelogwin -o %JSON%
Если используются оба 2 и 3 условия для разных узлов, оба варианта в скрипте должны быть раскомментированы!
Возможно для таких случаев сделать условие в скрипте и добавить макрос. (лишний раз впустую не запускать zabbix_sender и не отправлять данные в никуда)

Данные будут попадать в элемент:
Size-File-Trapper-LOG-Windows
Size-File-Trapper-LOG-Windows
Size-File-Trapper-LOG-Windows
Size-File-Trapper-LOG-Windows
Показать
Имя: Size-File-Trapper-LOG-Windows
Тип: Zabbix траппер
Ключ: filelogwin
Тип информации: Текст
Период хранения истории: 90d
Группы элементов данных: Проверка файлов
Описание:
Для долгих элементов подсчета размера файлов
Общий Лог пути и размер файлов, на него настраиваем зависимые элементы
Активировать необходимо если используется правило авто обнаружения
Windows Обнаружение файлов в определенной директории Trapper Логом
Активировано: V

Правило обнаружения
Windows Обнаружение Файлов в определенной директории Trapper Логом
Показать
Имя: Windows Обнаружение Файлов в определенной директории Trapper Логом
Тип: Внешняя проверка
Ключ: size-file.sh[{HOST.CONN},{$HOST.PORTS},discoverywin,{$PUTFILE},{$FILTRFILE},{$HIDEFILE},{$KODR},{HOST.HOST},{$HOST.PORTSACTIV},trapper_log]
Интервал обновления: 24h
Период сохранения потерянных ресурсов: 30d
Описание:
Директория где искать задается в Макросе узла
Декодировка Windows для Русского указать в макросе узла
Для определения какая у вас кодировка запросите в cmd команду
chcp
Для долгих запросов, через траппер для передачи данных разом (логом) в 1 элемент, далее создаются зависимые элементы.
Активировано
Windows Обнаружение Файлов в определенной директории Trapper Логом
Windows Обнаружение Файлов в определенной директории Trapper Логом
Прототипы элементов данных
Windows Обнаружение Файлов в определенной директории Trapper Логом Прототипы элементов данных и Триггеров
Windows Обнаружение Файлов в определенной директории Trapper Логом Прототипы элементов данных и Триггеров
Trapper-LOG-Получение размера файла в байтах {#NAMEFILEWIN}
Показать
Имя: Trapper-LOG-Получение размера файла в байтах {#NAMEFILEWIN}
Тип: Зависимый элемент данныx
Ключ: logsizefile["{#FILESIZEWIN}"]
Основной элемент данных: Обнаружение файлов и запрос их размера: Size-File-Trapper-LOG-Windows
Тип информации: Числовой (с плавающей точкой)
Группы элементов данных: Проверка файлов
Описание:
Получение размера файла в байтах {#NAMEFILEWIN} с помощью скрипта и траппера , которые долго обсчитываются. Получаем их из общего лога элемента и обрабатываем регулярным выражением.
Полный путь {#FILESIZEWIN}
В байтах
Создать активированным: V

Предобработка
Регулярное выражение
{#FILESIZEWIN}.*sizefile:(.*) timemodify:
вывод \1
Trapper-LOG-Получение размера  файла в байтах {#NAMEFILEWIN}
Trapper-LOG-Получение размера файла в байтах {#NAMEFILEWIN}
Остальные прототипы элементов так же идентичны 1 и 2 способу.
Отличие в том что:
1.В имя добавлено: Trapper-LOG-
2.Тип: Зависимый элемент данных
3.Основной элемент данных: Обнаружение файлов и запрос их размера: Size-File-Trapper-LOG-Windows
4.Ключи: logsizefile["{#FILESIZEWIN}"] ; logexists["{#FILESIZEWIN}"] ; logtimeaccess["{#FILESIZEWIN}"] ; logtimemodify["{#FILESIZEWIN}"] ; logtimechange["{#FILESIZEWIN}"]
5. Предобработка: регулярное выражение
{#FILESIZEWIN}.*sizefile:(.*) timemodify:
{#FILESIZEWIN}.*exists:(.*) sizefile:
{#FILESIZEWIN}.*timeaccess:(.*)
{#FILESIZEWIN}.*timemodify:(.*) timechange
logtimechange["{#FILESIZEWIN}"]
Вывод везде в: \1


Для получения ошибок каждого файла , а не конкретной общей.
Для элемента данных
Ошибки Правила Обнаружения Файлов
В скрипте нужно сделать проверку на ошибку в цикле включить условие в цикл.
количество слов: 4537
Аватара пользователя
Артём Мамзиков
Admin
Сообщения: 857
Стаж: 5 лет 8 месяцев
Откуда: Вологодская область
Поблагодарили: 37 раз
Контактная информация:

Обнаружение файлов и запрос их наличия, размера, даты изменения Шаблон + LLD скрипт

Сообщение Артём Мамзиков »

Из процесса создания данного шаблона и скриптов:

home_mf="${home//\\//}"
$ t='\a\b\c'; echo "${t//\\//}"
/a/b/c

home_mf="${home//'\'/"/"}"

home_mf=${home//\//\\}
home_mf=${home//\\//}

home_mf=$(printf "%s" "$home" | sed 's/\//\\/g') # вперед к обратной косой черте
home_mf=$(printf "%s" "$home_mf" | sed 's/\\/\//g') # в обратную косую черту


printf "%s\n" "$home_mf" instead of echo "$home_mf"
sed s command, e.g. s,/,\\,g and s,\\,/,g



Запрос по сети
zabbix_get -s 192.168.ххх.ххх -k system.run["dir /A:D /B \"\\\192.168.ххх.ххх\docs\""]

./size-dir-port.sh 192.168.ххх.ххх 10050 discoverywin "\\\192.168.ххх.ххх\docs"


dir /a-d /B - отобразить файлы
dir 123.txt /T:C покажет дату создания.
dir 123.txt /T:W покажет дату изменения.
/T:W - сортировать по времени модификации, последней операции записи ( Written ). Этот параметр используется по умолчанию.
/O:D - сортировать по дате и времени модификации файла или каталога.

/T - Выбор поля времени для отображения и сортировки
время:
C Создание (время создания - Create )
A Последнее использование (последний доступ - Accsess )
W Последнее изменение (последняя модификация Write)
/W - Вывод списка в несколько столбцов.

поиск строки даты
findstr /rc:"[0-9]\..*"
findstr /rc:"^[^ ]"
:: Строка дата размер файл
for /f "Skip=5 eol= delims=" %%p in ('dir C:\Users\14-1\dir-size-trapper-win5-cp866.bat') do echo %%p

set fileproperties=C:\Users\14-1\dir-size-trapper-win5-cp866.bat
:: Строка дата размер файл
for /f "Skip=5 eol= delims=" %%p in ('dir %fileproperties%') do echo %%p
:: Размер в байтах
for %%k in ("%fileproperties%") do echo %%~zk
:: Дата изменения
for %%i in ("%fileproperties%") do echo %%~ti
:: Наличие файла
IF EXIST "%fileproperties%" (set exists=1) ELSE (set exists=0)
echo %exists%
pause

исключить вывод папок Windows и Program Files?
dir /b /s "C:" 2>nul| findstr /ilv /c:"%ProgramFiles%" /c:"%windir%"
|FINDSTR /I /V /R /C:"^C\:\\Windows" /C:"^C\:\\Program\ Files"
|FINDSTR /I /V /R /C:"^C:\\Windows\>" /C:"^C:\\Program Files\>"

Eсли не нужен вывод только самих указанных папок, то код будет таким:
dir/b/s C:\| findstr/eilv /c::\Windows /c:":\Program Files"
Но, очевидно, ТС нужно исключить вывод как самих этих папок, так и их содержимого, и тогда код будет выглядеть так:
dir/b/s C:\| findstr/irv /c::\\Windows$ /c::\\Windows\\. /c:":\\Program Files$" /c:":\\Program Files\\."

|findstr /c:"System Boot Time" /c:"Host Name" /c:"OS Name" - поиск по нескольким критериям

FIND /I /V "ЧТО-скрыть" - Вывод всех строк, НЕ содержащих заданную строку. "" - показать все
FIND /I "ЧТО-Показать" - поиска текстовой строки "." - показать всё

set filtr=%4
set hide=%5
::Если переменная пустая пропишем стандартные данные
IF /i "%filtr%"1==""1 (set filtr=".")
IF /i %filtr%1==""1 (set filtr=".")
IF /i "%hide%"1==""1 (set hide="")
IF /i %hide%1==""1 (set hide="")
:: В шаблоне, для Linux указано .* и ^$ если не изменено меняем на .
IF /I [%filtr%]==[".*"] (set filtr=".")
IF /I [%hide%]==["^$"] (set hide="")
:: Запрос содержание данной директории (накопительная переменная) + фильтрация
for /f "tokens=1 delims=" %%b in ('dir /a-d /B %%a\ 2^>nul^|FIND /I %filtr%^|FIND /I /V %hide%') do set puti=!puti!%%a\%%b;
)

вывод в echo -e
-e - включить поддержку вывода Escape последовательностей:
\c - удалить перевод строки;
\t - горизонтальная табуляция;
\v - вертикальная табуляция;
\b - удалить предыдущий символ;
\n - перевод строки;
\r - символ возврата каретки в начало строки.
цвета текста:
\033[30m - чёрный;
\033[31m - красный;
\033[32m - зелёный;
\033[33m - желтый;
\033[34m - синий;
\033[35m - фиолетовый;
\033[36m - голубой;
\033[37m - серый.
цвета фона:
\033[40m - чёрный;
\033[41m - красный;
\033[42m - зелёный;
\033[43m - желтый;
\033[44m - синий;
\033[45m - фиолетовый;
\033[46m - голубой;
\033[47m - серый;
\033[0m - сбросить все до значений по умолчанию.
echo -e "\033[35mLinux \033[34mopen \033[32msource \033[33msoftware \033[31mtechnologies\033[0m"

Если мы делаем вывод пути Windows и делаем красиво с переносом строк \n
помимо того что нам нужно на выходе \\ слеша так как 1 теряется при входе в заббикс сервер как спец символ
(внутри скрипта так же при выполнении некоторых команд теряется слеш, поэтому изначально делаем их больше)
Еще момент если папка или имя файла начинается \fon \vers и другие считается за спец символы применяя к ним команду,
нужно экранировать '\\' тогда echo -e выведет нормально но у нас остаются одинарные кавычки, которые заббикс не принимает нужно делать пред обработку
Либо делать вывод кучей просто в echo без -e

ls -aF
параметр F -Добавить специальные символы к именам файлов, которые показывают, что это за файл
-F - показывать тип объекта, к каждому объекту будет добавлен один из специализированных символов */=>@|;

Тестовый скрипт 2.bat

Код: Выделить всё

setlocal enabledelayedexpansion

for /f "tokens=1 delims=" %%b in ('dir /a-d /B D:\test\ 2^>nul^|findstr/ir /c:"26" /c:"28"^|findstr /r /v "^$"') do set puti=!puti!%%b;
)
echo 
set puti=%puti:~0,-1%
:: Убираем все кавычки
set puti=%puti:"=%
::echo %puti%
:: Заново экранируем строку путь
set puti="%puti:;=";"%"
::echo %puti%
for %%c in (%puti%) do IF /I %%c1 NEQ ""1 ( echo 1) ELSE ( echo 0)
pause

set filtr=%4
set hide=%5
::set kodr=%6

set filtr=
set hide="25\|26"

:: Если переменная пустая (в кавычках "" и без) пропишем стандартные данные
IF /i %filtr%1==""1 (set filtr=".")
IF /i "!filtr!"1==""1 (set filtr=".")
IF /i %hide%1==""1 (set hide="'")
IF /i "!hide!"1==""1 (set hide="'")
:: В шаблоне, для Linux указано .* и ^$ если не изменено меняем на . 
IF /I [%filtr%]==[".*"] (set filtr=".")
IF /I [%hide%]==["^$"] (set hide="'")

:: Преобразуем переменные фильтров
set filtr=%filtr:\|=";"%
for %%a in (%filtr%) do set filtre=!filtre!/c:%%a 
set filtr=%filtre%

set hide=%hide:\|=";"%
for %%b in (%hide%) do set hidep=!hidep!/c:%%b 
set hide=%hidep%

dir /a-d /B D:\test\ 2^>nul|findstr/ir %filtr%|findstr/irv %hide%
pause

IF /i "%filtr%"1==""1 (set filtr=.3)
:: В шаблоне, для Linux указано .* если не изменено меняем на .
IF /I ["%filtr%"]==[".*"] (set filtr=.2)
echo %filtr%
pause
set fileproperties=C:\Users\14-1\dir-size-trapper-win5-cp866.bat
:: Строка дата размер файл
for /f "Skip=5 eol=  delims=" %%p in ('dir %fileproperties%') do echo %%p
:: Размер в байтах
for %%k in ("%fileproperties%") do echo %%~zk
:: Дата изменения
for %%i in ("%fileproperties%") do echo %%~ti

:: Наличие файла
IF EXIST "%fileproperties%" (set exists=1) ELSE (set exists=0)
echo %exists%
количество слов: 650
Аватара пользователя
Артём Мамзиков
Admin
Сообщения: 857
Стаж: 5 лет 8 месяцев
Откуда: Вологодская область
Поблагодарили: 37 раз
Контактная информация:

Обнаружение файлов и запрос их наличия, размера, даты изменения Шаблон + LLD скрипт

Сообщение Артём Мамзиков »

Изменения для:
dir-file-trapper-win-cp866-File.bat
dir-file-trapper-win-cp866-Fileif.bat
dir-file-trapper-win-cp1251-File.bat


Проблема возникала при определенных названиях папок и файлов из за строки

Код: Выделить всё

:: Заново экранируем строку путь
set puti="%puti:;=";"%"
Батник просто закрывался.

Было так

Код: Выделить всё

:: Разбор входных директорий, если их несколько
for %%a in (%way%) do (
:: Запрос содержание данной директории и подкаталогов (накопительная переменная) + фильтрация
for /f "tokens=1 delims=" %%b in ('dir /a-d /B /S %%a\ 2^>nul^|findstr/irv /c:"^$"^|findstr/ir %filtr%^|findstr/irv %hide%') do set puti=!puti!%%b;
)

:: Убираем все кавычки
set puti=%puti:"=%
:: Уберем последнюю ; так как она потом создает пустую переменную "" которая выполняет команду для текущей директории.
set puti=%puti:~0,-1%
:: Заново экранируем строку путь
set puti="%puti:;=";"%"
:: Разбор по адресам (путям)
for %%c in (%puti%) do set filename=%%c& call:size

Попытка №1 Попытка экранировать строку добавив " в начале и в конце строки перед перед set puti="%puti:;=";"%"

Код: Выделить всё

:: Разбор входных директорий, если их несколько
for %%a in (%way%) do (
:: Запрос содержание данной директории и подкаталогов (накопительная переменная) + фильтрация
for /f "tokens=1 delims=" %%b in ('dir /a-d /B /S %%a\ 2^>nul^|findstr/irv /c:"^$"^|findstr/ir %filtr%^|findstr/irv %hide%') do set puti=!puti!%%b;
)

:: Убираем все кавычки
set puti=%puti:"=%
:: Уберем последнюю ; так как она потом создает пустую переменную "" которая выполняет команду для текущей директории.
::set puti=%puti:~0,-1%
:: Уберем последнюю ; так как она потом создает пустую переменную "" которая выполняет команду для текущей директории и добавим кавычки в начало и в конец строки.
set puti="%puti:~0,-1%"
:: Заново экранируем строку путь
set puti="%puti:;=";"%"
:: Удалим кавычки в начале и конце строки
::set puti=%puti:~1,-1%
:: Разбор по адресам (путям)
for %%c in (%puti%) do set filename=%%c& call:size
И ничего это не дало


Попытка №2 в самом начале сразу добавим ";" вместо ; будет set puti=!puti!%%b";"

Код: Выделить всё

:: Разбор входных директорий, если их несколько
for %%a in (%way%) do (
:: Запрос содержание данной директории и подкаталогов (накопительная переменная) + фильтрация
for /f "tokens=1 delims=" %%b in ('dir /a-d /B /S %%a\ 2^>nul^|findstr/irv /c:"^$"^|findstr/ir %filtr%^|findstr/irv %hide%') do set puti=!puti!%%b";"
)
:: Уберем последнюю ";" так как она потом создает пустую переменную "" которая выполняет команду для текущей директории и добавим кавычки в начало и в конец строки.
set puti="%puti:~0,-3%"

:: Разбор по адресам (путям)
for %%c in (%puti%) do set filename=%%c& call:dateschange
Или можно еще так сразу экранировать строки set puti=!puti!"%%b";

Код: Выделить всё

:: Разбор входных директорий, если их несколько
for %%a in (%way%) do (
:: Запрос содержание данной директории и подкаталогов (накопительная переменная) + фильтрация
for /f "tokens=1 delims=" %%b in ('dir /a-d /B /S %%a\ 2^>nul^|findstr/irv /c:"^$"^|findstr/ir %filtr%^|findstr/irv %hide%') do set puti=!puti!"%%b";
)
:: Уберем последнюю ";" так как она потом создает пустую переменную "" которая выполняет команду для текущей директории.
set puti=%puti:~0,-1%

:: Разбор по адресам (путям)
for %%c in (%puti%) do set filename=%%c& call:dateschange
Далее уперлось в то что максимальная длина строки для cmd 8191 символов, а так как мы рекурсивно получаем список всех файлов текущей и подкаталогов папок выходит очень длинная строка и цикл
for %%c in (%puti%) do set filename=%%c& call:dateschange
не отрабатывает просто закрывается скрипт

Попытка №3 Сделать все сразу под циклом подставив напрямую Dir "%%b"

Код: Выделить всё

:: Экранируем пути добавляем кавычки было ; стало ";"
set way=%way:;=";"%
:: Разбор входных директорий, если их несколько
for %%a in (%way%) do (
:: Запрос содержание данной директории и подкаталогов (накопительная переменная) + фильтрация
for /f "tokens=1 delims=" %%b in ('dir /a-d /B /S %%a\ 2^>nul^|findstr/irv /c:"^$"^|findstr/ir %filtr%^|findstr/irv %hide%') do (
:: Наличие файла
IF EXIST "%%b" (set exists=1) ELSE (set exists=0)
for /f "tokens=1-5 delims=.: " %%j in ('2^>nul Dir "%%b" /T:W^|findstr /rc:"[0-9]\..*"') do set timemodify=%%l%%k%%j
:: %%m:%%n - время

:: Время изменения свойств файла (время создания)
for /f "tokens=1-5 delims=.: " %%j in ('2^>nul Dir "%%b" /T:C^|findstr /rc:"^[^ ]"') do set timechange=%%l%%k%%j
:: %%m:%%n - время
)
pause
)
Но так тоже не получается так как у нас идет несколько разных строк проверок а переменная под циклом идет ток в 1 строку, а если ее присвоить то можно забрать после цикла это будет последнее значение или придем от чего ушли к длинной строке.

Попытка №4 Вывод в файл и дальше читаем его циклом

Код: Выделить всё

:: Экранируем пути добавляем кавычки было ; стало ";"
set way=%way:;=";"%
:: Разбор входных директорий, если их несколько
for %%a in (%way%) do (
:: Запрос содержание данной директории и подкаталогов (накопительная переменная) + фильтрация
for /f "tokens=1 delims=" %%b in ('dir /a-d /B /S %%a\ 2^>nul^|findstr/irv /c:"^$"^|findstr/ir %filtr%^|findstr/irv %hide%') do set puti=!puti!%%b";"
)
set puti="%puti:~0,-3%"
echo %puti% > tеst.txt
pause
FOR /F "usebackq delims=;" %%c in ("%~dp0tеst.txt") do (
echo %%c
)
pause
И получаем только 1 путь значение до первой ;
если указать tokens=* тогда получаем просто все разом, если указывать tokens=a,b,c и так далее выводит все правильно но сколько же надо букв алфавита не хватит.
если сделать FOR %%c in (tеst.txt) do ( - так же ничего не выходит не хочет делить 1 строку через ; Нужно строками в файле.


Попытка №5 Выводим построчно в файл после забираем, так же сделаем условие от случайного попадания пустой переменной иначе dir отработает для текущего каталога! IF /I "%%b1" NEQ "1" (echo Данные "%%b") ELSE (echo Пустая переменая2)

Код: Выделить всё

:: Экранируем пути добавляем кавычки было ; стало ";"
set way=%way:;=";"%
:: Разбор входных директорий, если их несколько
for %%a in (%way%) do IF /I %%a1 NEQ ""1 (
:: Запрос содержание данной директории и подкаталогов (накопительная переменная) + фильтрация
for /f "tokens=1 delims=" %%b in ('dir /a-d /B /S %%a\ 2^>nul^|findstr/irv /c:"^$"^|findstr/ir %filtr%^|findstr/irv %hide%') do IF /I "%%b1" NEQ "1" (echo "%%b";>> "%~dp0SPISOKFILE.TXT") ELSE (echo Пустая переменая2)) ELSE (echo Пустая переменая1)

:: Разбор по адресам (путям)
FOR /F "usebackq delims=;"  %%c in ("%~dp0SPISOKFILE.TXT") do IF /I %%c1 NEQ ""1 ( set filename=%%c& call:dateschange) ELSE (echo Пустая переменая3)
Все работает)

Попытка №6 Сделать без файла подциклом так мы и строку длинную не получим и выполнится все должно

Код: Выделить всё

:: Экранируем пути добавляем кавычки было ; стало ";"
set way=%way:;=";"%
:: 1.Этап Разбор входных директорий, если их несколько
for %%a in (%way%) do IF /I %%a1 NEQ ""1 (
:: Запрос содержание данной директории и подкаталогов (накопительная переменная) + фильтрация, Разбор по адресам (путям)
for /f "tokens=1 delims=" %%b in ('dir /a-d /B /S %%a\ 2^>nul^|findstr/irv /c:"^$"^|findstr/ir %filtr%^|findstr/irv %hide%') do IF /I "%%b1" NEQ "1" ( set filename="%%b"& call:dateschange) ELSE (echo Пустая переменая2)) ELSE (echo Пустая переменая1)
И все работает оставляем так.

Ещё разные варианты

Код: Выделить всё

for %%a in (%way%) do IF /I %%a1 NEQ ""1 (
:: Запрос содержание данной директории (накопительная переменная) + фильтрация, Разбор по адресам (путям)
dir /a-d /B %%a\ 2>nul|findstr/irv /c:"^$"|findstr/ir %filtr%|findstr/irv %hide%>> "%~dp0SPISOKFILE.TXT"
for /f "usebackq tokens=1 delims=" %%b in ("%~dp0SPISOKFILE.TXT") do IF /I "%%b1" NEQ "1" ( set filename=%%a\"%%b"& call:size) ELSE (echo Пустая переменая1)) ELSE (echo Пустая переменая2)

:: Запрос содержание данной директории и ПОДКАТАЛОГОВ (ЧЕРЕЗ ФАЙЛ) + фильтрация, Разбор по адресам (путям)
::dir /a-d /B /S %%a\ 2>nul|findstr/irv /c:"^$"|findstr/ir %filtr%|findstr/irv %hide%>> "%~dp0SPISOKFILE.TXT"
::for /f "usebackq tokens=1 delims=" %%b in ("%~dp0SPISOKFILE.TXT") do IF /I "%%b1" NEQ "1" ( set filename="%%b"& call:size) ELSE (echo Пустая переменая1)) ELSE (echo Пустая переменая2)

:: Запрос содержание данной директории и ПОДКАТАЛОГОВ (накопительная переменная) + фильтрация, Разбор по адресам (путям)
::dir /a-d /B /S %%a\ 2>nul|findstr/irv /c:"^$"|findstr/ir %filtr%|findstr/irv %hide%>> "%~dp0SPISOKFILE.TXT") ELSE (echo Пустая переменая1)
::for /f "usebackq tokens=1 delims=" %%b in ("%~dp0SPISOKFILE.TXT") do IF /I "%%b1" NEQ "1" ( set filename="%%b"& call:size) ELSE (echo Пустая переменая2)
:: ИЛИ ВОЗМОЖНО ТАК c ^ работает на win server 2008, на win-10 не работает (Недопустимый ключ i v)
::dir /a-d /B /S %%a\ 2^>nul^|findstr/irv /C:"^$"^|findstr/ir %filtr%^|findstr/irv %hide%>> "%~dp0SPISOKFILE.TXT"
::for /f "usebackq tokens=1 delims=" %%b in ("%~dp0SPISOKFILE.TXT") do IF /I "%%b1" NEQ "1" ( set filename="%%b"& call:size) ELSE (echo Пустая переменая2)) ELSE (echo Пустая переменая1)

:: Запрос содержание данной директории (накопительная переменная) + фильтрация, Разбор по адресам (путям)
::for /f "tokens=1 delims=" %%b in ('dir /a-d /B %%a\ 2^>nul^|findstr/irv /c:"^$"^|findstr/ir %filtr%^|findstr/irv %hide%') do IF /I "%%b1" NEQ "1" ( set filename=%%a\"%%b"& call:size) ELSE (echo Пустая переменая2)) ELSE (echo Пустая переменая1)
:: Если нужны ПОДКАТАЛОГИ использовать
::for /f "tokens=1 delims=" %%b in ('dir /a-d /B /S %%a\ 2^>nul^|findstr/irv /c:"^$"^|findstr/ir %filtr%^|findstr/irv %hide%') do IF /I "%%b1" NEQ "1" ( set filename="%%b"& call:size) ELSE (echo Пустая переменая2)) ELSE (echo Пустая переменая1)
количество слов: 868
big971
Гость
Сообщения: 1
Стаж: 2 года 4 месяца

Обнаружение файлов и запрос их наличия, размера, даты изменения Шаблон + LLD скрипт

Сообщение big971 »

Добрый день!
при указании нескольких каталогов в $PUTFILE, например: /site/var/httprnko/webdav/partners/monwork_test;/site/var/httprnko/webdav/partners/test/

FILESIZELINUX в макросах и элементах данных выглядит так:
/site/var/httprnko/webdav/partners/monwork_test /site/var/httprnko/webdav/partners/test/test.txt

Все указанные каталоги в одну строку через пробел
количество слов: 30
Аватара пользователя
Артём Мамзиков
Admin
Сообщения: 857
Стаж: 5 лет 8 месяцев
Откуда: Вологодская область
Поблагодарили: 37 раз
Контактная информация:

Обнаружение файлов и запрос их наличия, размера, даты изменения Шаблон + LLD скрипт

Сообщение Артём Мамзиков »

big971, Добрый!
В макросе {$PUTFILE} - задаем путь без завершающего слеша, без пробелов через ; если их несколько

Пример:
Указываем макросе {$PUTFILE} узла пути через точку с запятой завершающий слеш не нужен
Пример для Windows:
{$PUTFILE} C:\zabbix;C:\Users
Для сети вначале проставить 3 слеша
\\\192.168.ххх.ххх\папка
Пример для Linux:
{$PUTFILE} /root;/home/user

Если надо ограничить файлы по названиям
Для этого можно воспользоваться фильтром в правиле обнаружения или макросами в узле.
{$FILTRFILE} по умолчанию в шаблоне задано отображать все .*
{$HIDEFILE} по умолчанию в шаблоне задано отображать все ^$
Для указания нескольких файлов (перечисления) вид следующий
Файл1\|Файл2\|Файл3 и так далее

Так быть не должно
В одну строку
/site/var/httprnko/webdav/partners/monwork_test /site/var/httprnko/webdav/partners/test/test.txt

Проверять командами через скрипт что выдает , на каком этапе так получается
количество слов: 37
big971
Гость
Сообщения: 1
Стаж: 2 года 4 месяца

Обнаружение файлов и запрос их наличия, размера, даты изменения Шаблон + LLD скрипт

Сообщение big971 »

Добрый день!
1. Указываю без завершающего слеша
/site/var/httprnko/webdav/partners/monwork_test;/site/var/httprnko/webdav/partners/test
2. Проверяю запуском скрипта
$ /site/app/rnkozabbix/etc/scripts/size-file.sh 192.168.ххх.х 10050 discovery "/site/var/httprnko/webdav/partners/monwork_test;/site/var/httprnko/webdav/partners/test" ".*" "^$" "" "имя сервера" "10051"
[
{"{#FILESIZELINUX}":"/site/var/httprnko/webdav/partners/monwork_test/test_test_000.txt", "{#NAMEFILELINUX}":"test_test_000.txt"},
{"{#FILESIZELINUX}":"/site/var/httprnko/webdav/partners/test/test_000.txt", "{#NAMEFILELINUX}":"test_000.txt"}
]
Вывод скриптом вопросов не вызывает
3. Активирую обнаружение "Linux Обнаружение файлов в определенной директории:"
В списке триггеров следующие записи (пример одной):
Колонка "выражение"
{имя сервера:vfs.file.size["/site/var/httprnko/webdav/partners/monwork_test /site/var/httprnko/webdav/partners/test/test_000.txt"].last()}>9663676416 or {имя сервера:vfs.file.size["/site/var/httprnko/webdav/partners/monwork_test /site/var/httprnko/webdav/partners/test/test_000.txt"].nodata(25h)}=1
Колонка "состояние" выводится "неизвестно"
И ошибка выводится: "Cannot evaluate expression: "Cannot evaluate function "имя сервера:vfs.file.size["/site/var/httprnko/webdav/partners/monwork_test /site/var/httprnko/webdav/partners/test/test_000.txt"].nodata(25h)": item does not have enough data after server start or item creation."."

"имя сервера" - заменил сервер этой строкой
Последний раз редактировалось big971 Чт авг 04, 2022 06:00, всего редактировалось 2 раза. количество слов: 157
Аватара пользователя
Артём Мамзиков
Admin
Сообщения: 857
Стаж: 5 лет 8 месяцев
Откуда: Вологодская область
Поблагодарили: 37 раз
Контактная информация:

Обнаружение файлов и запрос их наличия, размера, даты изменения Шаблон + LLD скрипт

Сообщение Артём Мамзиков »

big971, что бы точно исключить скрипт сделайте дополнительный вывод из скрипта в какой-нибудь >>family.log и посмотреть какой формируется json можно ещё и входные посмотреть как с заббикса приходит. Проверить правило обнаружения в заббикс и посмотреть что вышло в логи. Если там все ок , тогда сам заббикс что то не правильно принимает json.
количество слов: 5
Аватара пользователя
Артём Мамзиков
Admin
Сообщения: 857
Стаж: 5 лет 8 месяцев
Откуда: Вологодская область
Поблагодарили: 37 раз
Контактная информация:

Обнаружение файлов и запрос их наличия, размера, даты изменения Шаблон + LLD скрипт

Сообщение Артём Мамзиков »

Если при проверке Элемент данных выдает нет доступа к директории permission denied или путь не найден NOT_FOUND

Тут несколько вариантов:
1. Проверить путь и наличие файла возможно экранирование пути и \

2. Не хватает прав на папки (путь) на сам файл.
Решение: Выдать необходимые права или Сменить пользователя от которого работает Заббикс Агент
Windows в Службе заббикс агента
в Linux пример Запуск Zabbix Agent от Root

3. В конфигурации Заббикс Агента начиная с Zabbix 5.0 system.run
Удаленные команды по-прежнему отключены по умолчанию, но в новых конфигурационных файлах, которые выражаются с помощью нового параметра DenyKey (DenyKey=system.run[*]) черный список, разрешить все AllowKey=system.run[*].
Удаленные команды можно включить, удалив (или закомментировав) ключ DenyKey=system.run[*]
Либо настроить разрешения для определённых путей
Подробнее в оф.
Ранее этот параметр был EnableRemoteCommands = 1, иначе агент не сможет принимать команды.
Параметр EnableRemoteCommands теперь устарел.
Более подробно Поддержка черных и белых списков для метрик на стороне агента
количество слов: 30
a5001136
Гость
Сообщения: 1
Стаж: 1 год 9 месяцев

Обнаружение файлов и запрос их наличия, размера, даты изменения Шаблон + LLD скрипт

Сообщение a5001136 »

Здравствуйте
Все выполнил по инструкции, делаю проверку, вывод пустой. Но если посмотреть в лог zabbix_agent.log, то там видно что скрипт выполнился, и виден результат выполнения.
Значение элемента данных Запуск удаленного скрипта обнаружение файлов, через заббикс агент Linux изменилось на "1".

/usr/lib/zabbix/externalscripts/size-file.sh xx.xxx.xxx.xxx 10050 discovery "/space/all_dmp_restr/rnkin" "*.*" "^$" "" "xx.xxx.xxx.xxx" 10050
[
]
подскажите, куда посмотреть?
количество слов: 28
Ответить Вложения 47 Пред. темаСлед. тема

Вернуться в «Файлы и Папки»