Передать параметр скрипту через SNMP (при помощи snmpwalk)

Обсуждение настройки и работы сервисов, резервирования, сетевых настроек и вопросов безопасности ОС.

Модераторы: SLEDopit, Модераторы разделов

Аватара пользователя
Stauffenberg
Сообщения: 2041
Статус: ☮ PEACE ☮
ОС: открытая и свободная

Передать параметр скрипту через SNMP

Сообщение Stauffenberg »

Всем привет

Как известно, SNMP позволяет выполнять скрипты на целевой машине и получять результат (в виде строки) обратно.

Например, я могу получить стоку, которую вернет whoami, если у меня в /etc/snmp/snmpd.conf:

Код: Выделить всё

exec 1.3.6.1.4.1.2021.8.1.100 /usr/bin/whoami

Для этого мне надо воспользоваться командой:
> snmpwalk -v2c -c public localhost 1.3.6.1.4.1.2021.8.1.101


Т.е. SNMP, как я понимаю, связывает MIB с конкретной командой.
Возможно ли точно также вызвать скрипт, но при этом передать ему параметр, не задавая его в snmpd.conf, т.е. не создавая для каждого варианта с ключем свой MIB?
Labor omnia vincit

"Debugging is twice as hard as writing the code in the first place.
Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.” (Brian Kernighan)
Спасибо сказали:
Аватара пользователя
oper777
Сообщения: 411
ОС: gentoo

Re: Передать параметр скрипту через SNMP

Сообщение oper777 »

Stauffenberg писал(а):
18.08.2014 18:31
Всем привет

Как известно, SNMP позволяет выполнять скрипты на целевой машине и получять результат (в виде строки) обратно.

Например, я могу получить стоку, которую вернет whoami, если у меня в /etc/snmp/snmpd.conf:

Код: Выделить всё

exec 1.3.6.1.4.1.2021.8.1.100 /usr/bin/whoami

Для этого мне надо воспользоваться командой:
> snmpwalk -v2c -c public localhost 1.3.6.1.4.1.2021.8.1.101


Т.е. SNMP, как я понимаю, связывает MIB с конкретной командой.
Возможно ли точно также вызвать скрипт, но при этом передать ему параметр, не задавая его в snmpd.conf, т.е. не создавая для каждого варианта с ключем свой MIB?


snmpd передаёт же весь mib скрипту и его параметры.
На счет snmpwalk не скажу, а через snmpset (может и через snmpget?.. не проверял) можно передавать <тип> <значение>. Тип может быть как строкой, так и целым.

Реально работающий скрипт

Код: Выделить всё

#!/bin/bash
oid=$2

# param1
if $(echo $oid | grep -q "^\.1\.3\.6\.1\.4\.2\.1\.3\.21\.[0-9]*")
then
    if [ "$1" = "-s" ] && [ "$3" = "integer" ]
    then
        # OID parse
        ID=$(echo $oid | /usr/bin/cut -d . -f 11)
        if [ "$4" = "0" ]; then
.....
        if [ "$4" = "1" ]; then
....
        fi
        if [ "$4" = "2" ]; then
....
        fi
        if [ "$4" = "3" ]; then
....
        fi
    fi
fi

# param 2
if $(echo $oid | grep -q "^\.1\.3\.6\.1\.4\.2\.1\.21\.2\.[0-9]*")
then

....
fi

# param 3
if $(echo $oid | grep -q "^\.1\.3\.6\.1\.4\.2\.1\.21\.1\.[0-9]*\.[0-9]*")
then
    if [ "$1" = "-s" ] && [ "$3" = "integer" ]
    then
        # OID parse
        ID=$4
.....
    fi
    exit 0
fi

# param 4
if $(echo $oid | grep -q "^\.1\.3\.6\.1\.4\.2\.1\.21\.3\.[0-9]*\.[0-9]*")
then
    if [ "$1" = "-s" ] && [ "$3" = "integer" ]
    then
        # OID parse
....
    fi
    exit 0
fi

# param 5
if $(echo $oid | grep -q "^\.1\.3\.6\.1\.4\.2\.1\.21\.4\.[0-9]*")
then
    if [ "$1" = "-s" ] && [ "$3" = "integer" ]
    then
        # OID parse
        ID=$(echo $oid | /usr/bin/cut -d . -f 11)

        if [ "$4" = 0 ]; then
....
        else
....
        fi
    fi
    exit 0
fi

# param 6
if $(echo $oid | grep -q "^\.1\.3\.6\.1\.4\.2\.1\.21\.5\.[0-9]*")
then
    if [ "$1" = "-s" ] && [ "$3" = "integer" ]
    then
        # OID parse
        ID=$(echo $oid | /usr/bin/cut -d . -f 11 )
        if [ "$4" = 0 ]; then
....
        else
....
        fi
    fi
    exit 0
fi
Спасибо сказали:
Аватара пользователя
Stauffenberg
Сообщения: 2041
Статус: ☮ PEACE ☮
ОС: открытая и свободная

Re: Передать параметр скрипту через SNMP

Сообщение Stauffenberg »

oper777

Спасибо за ответ.
Я не совсем понял код скрипта (для каждого ключа, создается новый MIB?). Да, мне, в принципе, все равно как вызвать скрипт, т.е. получить от него ответ - я могу воспользоваться и snmpset и чем-то еще, работающим через SNMP.

Можете показать пример. В данном случае в /etc/snmp/snmpd.conf у нас uname. Как получить ответ от uname -a?
Labor omnia vincit

"Debugging is twice as hard as writing the code in the first place.
Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.” (Brian Kernighan)
Спасибо сказали:
Аватара пользователя
oper777
Сообщения: 411
ОС: gentoo

Re: Передать параметр скрипту через SNMP

Сообщение oper777 »

Ну вот условно в snmpd.conf

Код: Выделить всё

pass .1.3.6.1.2.1.31.1.1.1.6.999 /usr/local/sbin/GetP2PCount
pass .1.3.6.1.2.1.31.1.1.1.10.999 /usr/local/sbin/GetP2PCount
pass .1.3.6.1.2.1.2.2.1.11.999 /usr/local/sbin/GetP2PCount
pass .1.3.6.1.2.1.2.2.1.17.999 /usr/local/sbin/GetP2PCount


А в самом скрипте:

Код: Выделить всё

#!/usr/local/bin/bash

oid=$2

PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/games:/usr/local/sbin:/usr/local/bin

# p2p ipfw count get

#P2P bytes output
if [[ $oid == ".1.3.6.1.2.1.31.1.1.1.10.999" ]]
then
       тут всякие вычисления
    echo $oid
    echo string
    echo $count
    exit 0
fi

#P2P bytes input
if [[ $oid == ".1.3.6.1.2.1.31.1.1.1.6.999" ]]
then
       еще вычисления
    echo $oid
    echo string
    echo $count
    exit 0
fi

и т.д.


Запрос

Код: Выделить всё

snmpget -c communityname -v1 servername .1.3.6.1.2.1.31.1.1.1.10.999




Хмм... щас почитал хелпы от этих утилит, типа snmpset, snmpget, snmpwalk. Похоже передавать параметр может только snmpset. Тут надо экспериментировать
Спасибо сказали: