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
(или что-то эквивалентное; вам придется экспериментировать).