Получение случайного числа из сценария оболочки и сохранение его в файле с помощью snmpcommad (протокол SNMP)

Я столкнулся с проблемой запуска скрипта через команду snmpwalk, которая должна перенаправить случайное число в выходной файл:

Я настроил OID для скрипта в snmpd.conf undet /etc/snmp/ as exec .1.3.6.1.4.1.99.1.53.1006 script.sh.sh /root/my_folder/script.sh


Мой скрипт такой:

#!/usr/bin/ksh 

Out_Path="$HOME/output.txt" 

echo $RANDOM >> $Out_Path
--------------------------

Теперь я выполняю команду snmpwalk как: snmpwalk -t 10 -v 1 -c public 127.0.0.1.1.3.6.1.4.1.99.1.53.1006, и в выходном файле я получаю 2 случайных числа вместо 1. Я ожидаю только одно Случайное число должно присутствовать в файле output.txt. Может ли кто-нибудь объяснить поведение или какое-то решение?


Актуальная проблема:

Я объясняю, чего я хочу достичь. Мне нужно выполнить скрипт с помощью команды snmpget.

Проблема 1: Когда я использую команду SNMPGET, скрипт выполняется, и ответ (внутренний) я получаю полным (более 1 КБ), но после сохранения этого ответа в файле я делаю echo $ строка в цикле while, который займет строку файла, и, как я и ожидал, он должен показать мне все данные (но я могу получить только данные 1 КБ)

Проблема 2: Чтобы решить проблему 1, я принимаю новый дизайн, который похож на 1 OID (скрипт), я получил все данные в файле. После этого я выполняю новый скрипт, используя новый OID, который будет получать 1 запись (1 КБ) и изменять существующие данные и обновить данные. Таким образом, я буду выполнять второй скрипт несколько раз, используя snmpwalk с другим OID, поэтому я получу всю запись. Но моя проблема в том, что когда я пытаюсь обновить запись (файл), а затем в одном выполнении он удаляет данные размером 2 КБ, по этой причине я разместил вопрос (2 случайных числа в 1 команде snmpwalk).

Я надеюсь, что теперь вы понимаете проблему, но если вам нужны подробности, я объясню вам.


person Astro - Amit    schedule 12.12.2012    source источник
comment
Этот скрипт будет накапливать случайные числа в файле (>> дописывает строку к содержимому файла, удобно для логов, а > открывает файл с нуля), нужно ли вам такое поведение?   -  person Dmytro Sirenko    schedule 12.12.2012
comment
@EarlGray: мне нужно, чтобы, если я выполню команду snmpwalk один раз, в выходном файле должна присутствовать только одна запись. Случайное число (echo $ RANDOM › $ Out_Path) снова перенаправит 2 записи вместо 1. Но мне нужна только одна случайная номер, выполнив команду snmpwalk   -  person Astro - Amit    schedule 12.12.2012
comment
Команда snmpwalk состоит из команд snmpgetnext, повторяющихся до тех пор, пока есть что-то, что нужно вернуть в поддереве. Я предполагаю, что в этом случае за одним вызовом snmpwalk отправляются два запроса getnext, чтобы определить, что данных для извлечения больше нет. Чтобы быть уверенным, пожалуйста, проанализируйте трафик, используя tcpdump или какое-либо решение для wireshark. Кстати. Вы уверены, что -t10 - правильный тайм-аут? Я бы установил для параметра явного повторения значение 0, чтобы избежать повторных передач (параметр -r0).   -  person lucassm    schedule 17.12.2012
comment
@lucassm: Вы правы на 100%, причина та же, что и вы сказали. Не могли бы вы записать всю команду с указанным выше параметром, чтобы я мог выполнить то же самое. Итак, как я могу получить одну запись. Моя настоящая проблема в том, что у меня есть данные, которые я должен получить через snmp, но когда я использую команду snmpget, я могу получить только данные размером 1 КБ, не более того, поэтому возможно, что я могу получить более 1 КБ данных grom snmp get? Из-за этого 1 КБ Я разработал новую вещь, которая будет комбинацией команд snmpwalk, но в этом я столкнулся с проблемой, которую я задал здесь.   -  person Astro - Amit    schedule 19.12.2012
comment
Хорошо, поправьте меня, если я ошибаюсь. То, что вы пытаетесь сделать, это выполнить запрос snmp get/getnext для OID, который вы упомянули выше, чтобы выполнить сценарий и вернуть его вывод в виде ответа SNMP. Я думаю, что проблема с 1 КБ вызвана чем-то другим - это не похоже на проблему агента SNMP при создании больших ответов. Пожалуйста, попробуйте выполнить команду SNMPv1 (если у вас есть доступ к SNMPv3, сообщите мне об этом): snmpget -v1 -r0 -cprivate ‹IP› ‹OID› или snmpgetnext -v1 -r0 -cprivate ‹IP› .1.3.6.1.4.1 .99.1.53.1005. Обратите внимание на 1005 октетов в конце. Такой OID может не существовать, getnext должен получить правильный доступ к 1006.   -  person lucassm    schedule 19.12.2012
comment
Упс, я забыл добавить опцию тайм-аута, которая может потребоваться здесь, так как тайм-аут по умолчанию составляет 5 секунд. Итак, полная команда: snmpget -v1 -t25 -r0 -cprivate ‹IP› ‹OID› или snmpgetnext -v1 -t25 -r0 -cprivate ‹IP› .1.3.6.1.4.1.99.1.53.1005 — дайте мне знать о Результаты. Ваше здоровье.   -  person lucassm    schedule 19.12.2012
comment
Скопируйте и вставьте мои комментарии в качестве ответа, чтобы сделать текст более читабельным.   -  person lucassm    schedule 19.12.2012
comment
@lucassm, пожалуйста, проверьте отредактированный вопрос.   -  person Astro - Amit    schedule 19.12.2012


Ответы (1)


Команда snmpwalk состоит из команд snmpgetnext, повторяющихся до тех пор, пока есть что-то, что нужно вернуть в поддереве. Я предполагаю, что в этом случае за одним вызовом snmpwalk отправляются два запроса getnext, чтобы определить, что данных для извлечения больше нет. Чтобы быть уверенным, пожалуйста, проанализируйте трафик, используя tcpdump или какое-либо решение для wireshark. Кстати. Вы уверены, что -t10 - правильный тайм-аут? Я бы установил для параметра явного повторения значение 0, чтобы избежать повторных передач (параметр -r0).

То, что вы пытаетесь сделать, это выполнить запрос snmp get/getnext для OID, который вы упомянули выше, чтобы выполнить сценарий и вернуть его вывод в виде ответа SNMP. Я думаю, что проблема с 1 КБ вызвана чем-то другим - это не похоже на проблему агента SNMP при создании больших ответов. Попробуйте выполнить команду SNMPv1 (если у вас есть доступ к SNMPv3, сообщите мне об этом):

snmpget -v1 -t25 -r0 -cprivate <IP> .1.3.6.1.4.1.99.1.53.1006

or

snmpgetnext -v1 -t25 -r0 -cprivate <IP> .1.3.6.1.4.1.99.1.53.1005

Обратите внимание на октет 1005 в конце OID для запроса snmpgetnext. Такой OID может не существовать, getnext должен правильно получить доступ к 1006, поскольку он первый, существующий OID после 1005.

person lucassm    schedule 19.12.2012
comment
Я не думаю, что вам следует углубляться в решение, описанное как проблема 2. Это слишком сложно для такого простого случая. По вашему OID кажется, что это столбец в какой-то таблице (это же не скаляр, верно?). Чтобы избежать ограничения в 1 КБ, с которым вы сталкиваетесь, я предлагаю создать отдельную таблицу MIB с одним столбцом «данные» и индексом, определенным как Integer32. Номера строк в этой таблице могут варьироваться в зависимости от размера вывода сценария и индексироваться как .1 — первая строка вывода (или первое некоторое количество байтов ‹ 1 КБ) и так далее. Чтобы заполнить эту таблицу, вы можете предоставить скалярный объект MIB только для запуска выполнения скрипта. - person lucassm; 19.12.2012
comment
Итак, сначала вы выполняете set-request для скалярного объекта и устанавливаете его значения в некоторое предопределенное значение Textual-Convention (например, активировать (1)), а после этого вы выполняете snmpwalk для таблицы, чтобы получить, т.е. построчно или несколько строк- на несколько строк вывода. Каждая строка должна возвращать менее 1 КБ вывода. Есть еще вопросы? - person lucassm; 19.12.2012
comment
Что касается вышеупомянутого предложения, я понятия не имею о создании и модификации MIB и о том, как писать MIB. Я знаю, что /usr/share/snmp/mibs — это место для MIB, где присутствуют все MIB, и для настройки я знаю файл snmpd.conf, который находится в папке /etc/snmp/ ...пожалуйста, объясните простым языком? - person Astro - Amit; 19.12.2012