Войти

Показать полную графическую версию : [решено] Сбор статистики


KAPMAHOK
24-12-2014, 12:15
Добрый день!

Второй день бьюсь над простеньким скриптом и никак не могу побороть, решил обратить за помощью к умным людям.

И так суть такова:

Есть сетевой запрос по Snmp на определённый список адресов сетевых принтеров, который показывает счётчик страниц. Нужно в текстовый файл записать значения вида ip address=счётчик страниц!

запрос вида

Snmpget.exe -r:192.168.1.1 -o:.1.3.6.1.2.1.43.10.2.1.4.1.1

Выдаёт

SnmpGet v1.01 - Copyright (C) 2009 SnmpSoft Company
[ More useful network tools on http://www.snmpsoft.com ]

OID=.1.3.6.1.2.1.43.10.2.1.4.1.1
Type=Counter32
Value=237326

Все мои попытки привели к такому варианту, но записывает одни и те же значения в файл(((

del Counter.txt

for /F "EOL=; TOKENS=*" %%i in (ip_printers.txt) do (D:\SNMPWalk\Snmpget.exe -r:%%i -o:.1.3.6.1.2.1.43.10.2.1.4.1.1 > r.txt

for /f "usebackq tokens=*" %%a in ("r.txt") do (set %%a)

echo %%i=%Value% >> Counter.txt

)

Сильно не пинайте, я с этим делом впервые сталкиваюсь(

Foreigner
24-12-2014, 12:58
Как выглядит ip_printers.txt ?

KAPMAHOK
24-12-2014, 13:11
Выглядит так:

192.168.1.1
192.168.1.2
192.168.1.3

Foreigner
24-12-2014, 13:26
KAPMAHOK, Попробуйте так, не проверял:

@echo off
setlocal

for /f %%i in (ip_printers.txt) do call:1 %%i
goto:eof

:1
for /f "skip=3" %%i in (' Snmpget.exe -r:%1 -o:.1.3.6.1.2.1.43.10.2.1.4.1.1 ') do 1>nul set "%%i"
1>>counter.txt echo %1=%value%

Пути к файлам откорректируйте сами.

KAPMAHOK
24-12-2014, 13:40
Вот, спасибо))) То что надо!!!

Ой а как в конце добавить отсылку на почту, но чтобы она не повторялась, после каждой записи в файл, а только после завершения цикла отправила файл с помощью blat.exe?

Foreigner
24-12-2014, 15:59
как в конце добавить отсылку на почту »

Добавить команду blat:

....
for /f %%i in (ip_printers.txt) do call:1 %%i
blat бла-бла-бла -attach "C:\Folder\Folder\counter.txt"
goto:eof
.....

STLK
25-12-2014, 10:08
Приветствую.

Совсем недавно решал точно такую же задачу с опросом из списка через snmpget.exe, записью результата в csv таблицу и отпправкой с использованием blat.
У меня правда скрипт гораздо топорней. Просто в лоб по каждому ip.

Вот хочу оптимизировать. Очень понравилось лаконичное решение от Foreigner,

Но когда пробую у себя, пишет такую ошибку

set "%Failed" 1>nul
Environment variable "%Failed not defined

причем "%Failed это начало строки ответа snmpget.exe в случае если нет соединения. Такое бывает при опросе это норм.

В итоговом файле (counter.txt) просто 192.168.1.1=

Своими копеечными познаниями bat, понимаю что переменная не определена, но вот как это исправить?




Кстати если указать параметр -q то snmpget выдаст результат в одну строчку и тогда не нужен "skip=3"

Foreigner
25-12-2014, 11:09
STLK, set "%Failed" 1>nul »
Ну так здесь должна быть переменная указанная на выходе Snmpget.exe. Т.е. получаются три переменные %OID%, %Type% и %Value%, а Failed там взяться не откуда:

for /f "skip=3" %%i in (' Snmpget.exe -r:192.168.1.1 -o:.1.3.6.1.2.1.43.10.2.1.4.1.1 ') do 1>nul set "%%i"
echo %OID%
echo %Type%
echo %Value%

1>nul здесь подавляет вывод всех переменных команды set
Кстати если указать параметр -q то snmpget выдаст результат в одну строчку и тогда не нужен "skip=3"
У меня нет этой утилиты, ориентировался на приведенный KAPMAHOK вывод ее на консоль.

Iska
25-12-2014, 14:06
Там же в выводе ссылка на сайт приведена: SnmpGet.zip (143KB) (http://www.snmpsoft.com/downloads/SnmpGet.zip).

Foreigner
25-12-2014, 14:25
Iska, Подозреваю, что она бесполезна без принтера

STLK
25-12-2014, 14:41
Foreigner,
Спасибо. Работает.


Подскажите еще как можно реализовать опрос не по одному а нескольким значениям OID ? И результат дописывать в ту же строку?

Т.е. в итоговом файле counter.txt в одну строку через точку с запятой должны быть указаны:

IP (переменная %1 в подпрограмме :1); значение %value% от выполнения команды Snmpget.exe -r:%1 -o:.1.3.6.1.2.1.43.10.2.1.4.1.1 ; и тоже значение %value% но с другим -o

Все что приходит в голову - это по очереди выполнять запросы с разными OID. как вписать результаты в одну строку?

Foreigner
25-12-2014, 15:58
STLK, Если верно понял:

@echo off
setlocal

for /f %%i in (ip_printers.txt) do call:1 %%i
goto:eof

:1
for %%i in (.1.3.6.1.2.1.43.10.2.1.4.1.1 .1.3.6.1.2.1.43.10.2.1.4.1.2) do (

for /f "skip=3" %%j in (' Snmpget.exe -r:%1 -o:%%i ') do 1>nul set "%%i_%%j"

)

1>>counter.txt echo %1;%.1.3.6.1.2.1.43.10.2.1.4.1.1_value%;%.1.3.6.1.2.1.43.10.2.1.4.1.2_value%

Iska
25-12-2014, 18:24
Iska, Подозреваю, что она бесполезна без принтера »
Верно подозреваете. Но для отладки подойдёт, как я подозреваю [теперь уже я ;)], любое устройство, например, приличный сервер, роутер, управляемый switch и т.п. С принтером я вчера вечером опробовать успел.

P.S. Я бы всё ж таки с «-q» попробовал, для простоты.

STLK
26-12-2014, 17:21
Тут возник один момент. Если IP доступен, то значение %value% прописывается в итоговый отчет без проблем.

Но, если связи нет, то вместо значения будет ошибка %Failed to get value of SNMP variable. Timeout.
В этом случае скрипт оставляет строку пустой. И если этот IP не первый в списке, запишет в итоговый отчет значение %value% от предидущего IP.

Foreigner
26-12-2014, 17:47
STLK, Пропинговать?

....
:1
1>nul ping -n 1 %1 || ( 1>>counter.txt echo IP: %1 not available at %date% %time:~0,-3% & goto:eof )
....

STLK
29-12-2014, 18:49
Foreigner, Супер!
Собрал в один скрипт. Все работает!

По каждому IP выводит в отчет два параметра через ; или Timeout если нет ответа


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

Т.е. пинг отработал а snmpget уже нет =(

Заметил это прогнав скрипт на большом списке IPшников, через удаленное соединение.


Как сделать проверку- есть ли в %value% текст ошибки (%Failed to get value of SNMP variable. Timeout.) и повторно запускать цикл опроса. Так подряд 2-3 раза, и если все равно Timeout - писать в отчет что "не получилось" и тогда уже переходить к следующему IP ?

Iska
29-12-2014, 19:19
Вот только вариант с проверкой пингом боюсь в моей ситуации не подойдет.
канал связи настолько не стабилен, что за время пока выполняется команда, может отвалиться соединение.
Т.е. пинг отработал а snmpget уже нет =( »
Фильтруйте вывод по ключевым словам.

Так подряд 2-3 раза, »
Два или три ;)?

Foreigner
29-12-2014, 19:54
Iska, Согласен, плюс лучше проверять пинг через поиск "TTL"

ping 192.168.0.1 -n 3 | 1>nul findstr "TTL=" || echo ERROR!!!

Iska
30-12-2014, 03:25
плюс лучше проверять пинг через поиск "TTL" »
Я нет-нет, да забываю об этом :(.

ex541
17-06-2016, 15:40
Foreigner, Добрый день! Ваш скрипт служил мне верой и правдой долгое время, собирал счетчики, хост нэймы, но появилась необходимость собрать mac-адреса. При записи в скрипт OID mac-адреса принтера случается проблема.

Mac адрес выглядит так 18:a9:05:fd:53:56

скрипт записывает в файл:

Режим вывода команд на экран (ECHO) отключен.

а в окне пишет

переменная среды .1.3.6.1.4.1.11.2.4.3.1.23.0 _%Failed не определена

Текст скрипта привожу ниже


@echo off
setlocal

for /f %%i in (ip_printers.txt) do call:1 %%i
goto:eof

:1
1>nul ping -n 4 %1 || ( 1>>mac.txt echo ND )


:1
for %%i in (.1.3.6.1.4.1.11.2.4.3.1.23.0) do (

for /f "skip=3" %%j in (' Snmpget.exe -r:%1 -o:%%i ') do 1>nul set "%%i_%%j"

)

1>>mac.txt echo %.1.3.6.1.4.1.11.2.4.3.1.23.0_value%




© OSzone.net 2001-2012