Я пытаюсь использовать Perl и Net::SNMP
для запроса устройства с несколькими настроенными представлениями/контекстами (например, Cisco ACE 4710) , Команда эквивалент snmpwalk является:Чтение значений SNMP с устройства с несколькими контекстами ACM на основе представления, используя Net :: SNMP
snmpwalk -c [email protected]_NAME -v 2c 1.2.3.4 '.1.3.6.1.4.1.9.9.480.1.1.2'
Я могу перечислить различные контексты/виды с SNMP-VIEW-BASED-ACM-MIB, например:
my $vacmContextName = '.1.3.6.1.6.3.16.1.1.1.1';
my ($session, $error) = Net::SNMP->session(-hostname => '1.2.3.4', -community => 'public');
my %contexts = %{ $snmp->get_entries(-columns => [ $vacmContextName ]) };
... но у меня возникают проблемы в настоящее время читать дальше OIDs от каждого конкретного контекста, например:
my $ciscoL4L7ResourceLimitTable = '.1.3.6.1.4.1.9.9.480.1.1.2';
my ($session, $error) = Net::SNMP->session(-hostname => '1.2.3.4', -community => '[email protected]_NAME');
my %stats = %{ $snmp->get_entries(-columns => [ $ciscoL4L7ResourceLimitTable ]) }
Если я бегу с -debug => DEBUG_ALL
, я вижу, данные возвращаются в инспекции пакетов (с узнаваемыми данными из этого контекста), но го ан я получаю много из следующих ошибок:
error: [131] Net::SNMP::Security::Community::process_incoming_msg(): The community name "[email protected]_NAME" was expected, but "public" was found
error: [218] Net::SNMP::MessageProcessing::prepare_data_elements(): The community name "[email protected]_NAME" was expected, but "public" was found
error: [398] Net::SNMP::Dispatcher::_transport_response_received(): The community name "[email protected]_NAME" was expected, but "public" was found
error: [1234] Net::SNMP::__ANON__(): The community name "[email protected]_NAME" was expected, but "public" was found
error: [2363] Net::SNMP::__ANON__(): The community name "[email protected]_NAME" was expected, but "public" was found
... и в результате содержание %stats
является undef
.
Если я пытаюсь использовать -community => 'public'
, он работает, но я получаю только значения из контекста по умолчанию (который не содержит всего, что мне нужно).
Если я пытаюсь с -contextname => 'CONTEXT_NAME'
, я просто получаю:
error: [2423] Net::SNMP::_context_name(): The contextName argument is only supported in SNMPv3
Разве это не возможно, чтобы делать то, что мне нужно с Net::SNMP
?
This is perl, v5.10.1 (*) built for i386-linux-thread-multi
CPAN_FILE D/DT/DTOWN/Net-SNMP-v6.0.1.tar.gz
INST_VERSION v6.0.1
1) Вы не указываете версию SNMP в 'Net :: SNMP-> session()' (по умолчанию - v1). 2) Согласно [руководству по администрированию серии ACE 4700] (http://www.cisco.com/en/US/docs/app_ntwk_services/data_center_app_services/ace_appliances/vA3_1_0/configuration/admin/guide/snmp.html#wp1082931), каждый контекст имеет свой собственный IP-адрес. В ваших фрагментах кода отображается только один IP-адрес. 3) Контексты были введены в SNMP v3, следовательно, ошибка Net :: SNMP. Cisco предоставила средства для доступа к контексту для SNMP v1, v2 и v2c, если вы следуете приведенному выше руководству. – ThisSuitIsBlackNot
@ThisSuitIsBlackNot - ** 1) ** Артефакт попытки свести код к минимуму, чтобы продемонстрировать проблему - он не работает ни с 'snmpv1', ни с snmpv2c; ** 2) ** Каждый контекст имеет свой собственный IP-адрес, но это не типично (и, следовательно, я не собираюсь) включить управляющий трафик на всех IP-адресах, а только контекста администратора (который находится в выделенной VLAN) ; ** 3) ** В руководстве показано использование «snmpget -c COMMUNITY @ CONTEXT ...», которое я уже продемонстрировал выше, но то же самое, похоже, не применяется к Net :: SNMP (или, скорее, Net :: SNMP явно предотвращает это). – jimbobmcgee
Это не помогает другим отлаживать ваш код, если вы удаляете важные биты, но это ни здесь, ни там. Просто для уточнения, * admin * context IP - это «1.2.3.4», строка контекстного сообщества * admin * является «public», а контекст * user *, к которому вы хотите получить доступ, - 'CONTEXT_NAME'? – ThisSuitIsBlackNot