Python Netsnmp и snmpwalk

Я пытаюсь использовать snmpwalk, чтобы получить некоторую информацию и статистику по некоторым интерфейсам. Я использую это:

import netsnmp

serv = "172.16.1.1"
snmp_pass = "private"

oid = netsnmp.VarList('IF-MIB::ifName','IF-MIB::ifDescr')
snmp_res = netsnmp.snmpwalk(oid, Version=2, DestHost=serv, Community=snmp_pass)
for x in snmp_res:
    print "snmp_res:: ", x

Все, что я получаю в ответ:

snmp_res:: lo
snmp_res:: EtherNet Adapter XYZ

Ответ правильный, но я хочу больше информации. Когда я делаю то же самое из команды linux с snmpwalk, я получаю больше информации, например:

IF-MIB::ifDescr.1 = STRING: lo
IF-MIB::ifDescr.2 = STRING: EtherNet Adapter XYZ

Идентификатор равен 2 для "EtherNet Adapter XYZ", и мне нужно это значение, чтобы ссылаться на другие характеристики интерфейса. Как я могу получить это / их с Python и SNMP?

1 ответ

Решение

Прямо из документации:

snmpwalk(<Varbind/VarList>, <Session args>))

Принимает аргументы netsnmp.Session, которому предшествует Varbind или VarList, с которого начнется операция walk. Возвращает кортеж значений, извлеченных из MIB ниже переданной переменной Varbind. Если в нее передан VarList, он будет обновлен и будет содержать полный набор VarBinds, созданный для результатов обхода. Не рекомендуется передавать только Varbind, так как вы теряете возможность проверять возвращенные OID. Но если передается только Varbind, он будет возвращен без изменений.

Обратите внимание, что в передаваемом VarList должен содержаться только один varbind. Код структурирован так, что, возможно, это будущее, но сейчас обход нескольких деревьев одновременно не поддерживается и приведет к недостаточным результатам.

Вы уже передаете VarList, поэтому у вас уже есть то, что вам нужно. Вам просто нужно правильно изучить результаты.

Тесты имеют пример:

vars = netsnmp.VarList(netsnmp.Varbind('system'))

vals = sess.walk(vars)
print "v1 sess.walk result: ", vals, "\n"

for var in vars:
    print "  ",var.tag, var.iid, "=", var.val, '(',var.type,')'

Ключ в том, что входная переменная модифицируется, чтобы дать вам то, что вам нужно. Возвращаемое значение не имеет большого значения (смеется) для вас.

Собрав все это вместе, похоже, вы хотите следующее:

import netsnmp

serv = "172.16.1.1"
snmp_pass = "private"

oid = netsnmp.VarList('IF-MIB::ifName','IF-MIB::ifDescr')
snmp_res = netsnmp.snmpwalk(oid, Version=2, DestHost=serv, Community=snmp_pass)
for x in oid:
    print "snmp_res:: ", x.iid, " = ", x.val

(Отказ от ответственности: не могу проверить; адаптировать при необходимости)

В этой документации достаточно информации о VarBind и VarList, чтобы выяснить, что лучше всего выбрать x,

x.iid это идентификатор экземпляра, так что это должно дать вам 1 а также 2 что вы после. Не забудьте изучить x.tag а также, что будет либо IF-MIB::ifName или же IF-MIB::ifDescr (или что-то эквивалентное; вам придется экспериментировать).

Другие вопросы по тегам