Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Сбор статистики (http://forum.oszone.net/showthread.php?t=292996)

KAPMAHOK 24-12-2014 12:15 2447628

Сбор статистики
 
Добрый день!

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

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

Есть сетевой запрос по 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 2447639

Как выглядит ip_printers.txt ?

KAPMAHOK 24-12-2014 13:11 2447644

Выглядит так:

192.168.1.1
192.168.1.2
192.168.1.3

Foreigner 24-12-2014 13:26 2447646

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 2447652

Вот, спасибо))) То что надо!!!

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

Foreigner 24-12-2014 15:59 2447701

Цитата:

Цитата KAPMAHOK
как в конце добавить отсылку на почту »

Добавить команду 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 2447973

Приветствую.

Совсем недавно решал точно такую же задачу с опросом из списка через 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 2447999

STLK,
Цитата:

Цитата 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 2448102

Там же в выводе ссылка на сайт приведена: SnmpGet.zip (143KB).

Foreigner 25-12-2014 14:25 2448113

Iska, Подозреваю, что она бесполезна без принтера

STLK 25-12-2014 14:41 2448117

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 2448142

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 2448207

Цитата:

Цитата Foreigner
Iska, Подозреваю, что она бесполезна без принтера »

Верно подозреваете. Но для отладки подойдёт, как я подозреваю [теперь уже я ;)], любое устройство, например, приличный сервер, роутер, управляемый switch и т.п. С принтером я вчера вечером опробовать успел.

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

STLK 26-12-2014 17:21 2448626

Тут возник один момент. Если IP доступен, то значение %value% прописывается в итоговый отчет без проблем.

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

Foreigner 26-12-2014 17:47 2448639

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 2449653

Foreigner, Супер!
Собрал в один скрипт. Все работает!

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


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

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

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


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

Iska 29-12-2014 19:19 2449665

Цитата:

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

Фильтруйте вывод по ключевым словам.

Цитата:

Цитата STLK
Так подряд 2-3 раза, »

Два или три ;)?

Foreigner 29-12-2014 19:54 2449676

Iska, Согласен, плюс лучше проверять пинг через поиск "TTL"
Код:


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


Iska 30-12-2014 03:25 2449790

Цитата:

Цитата Foreigner
плюс лучше проверять пинг через поиск "TTL" »

Я нет-нет, да забываю об этом :(.

ex541 17-06-2016 15:40 2643519

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%



Время: 11:35.

Время: 11:35.
© OSzone.net 2001-