2

Я пытаюсь написать bash-скрипт, который собирает информацию через SNMPv3 и генерирует шаблон конфигурации для данного устройства.

Моя цель - создать шаблон на основе переменных mibnumberX и interfaceX, где X - это число, определяемое пользовательским вводом (например, сколько интерфейсов вы хотите добавить? как называются интерфейсы?)

#!/bin/bash

# Ambiguously defined variables for the sake of demonstration:

authpriv="authPriv"
devicetype="ASA"
snmpuser="username"
authhash="SHA"
authstring="authpassword"
privhash="AES"
privstring="privpassword"
ipaddress="1.1.1.1"
interface1="Inside"
interface2="Outside"
numberofifs="2"
defaultasa="yes"


# Determine how many interfaces are to be added and what their friendly names are

if [[ $defaultasa = "yes" ]];
  then
    read -p "How many interfaces would you like to add to monitoring for this device? " numberofifs
    for ((i = 1; i <= numberofifs; i++))
    do
      read -p "Please enter the name of interface number ${i} and press [ENTER]: " interface${i}
    done
fi


# Walk the ifDescr MIBs, grep with the friendly name of the interface(s) and store the last number of IF-MIB::ifDescr.16 in *mibnumberX*.

if [[ $authpriv = "authPriv" ]] && [[ $devicetype = "ASA" ]];
  then
  for ((i = 1; i <= numberofifs; i++))
  do
    eval "ifnumber=\$interface$i"
    eval "mibnumber$i=$(snmpwalk -v3 -u $snmpuser -l AuthPriv -a $authhash -A $authstring -x $privhash -X $privstring $ipaddress ifD | grep -i $ifnumber | awk -F"[<.=>]" '{print $2}')"
  done
fi


# Display interface names and MIBs

printf "Name: $interface1\n MIB number: $mibnumber1\nName: $interface2\n MIB Number: $mibnumber2\n"

Результаты скрипта:

$ ./test.sh
Name: Inside
 MIB number: 15
Name: Outside
 MIB Number: 16

Намерение состоит в том, чтобы циклически перебирать переменные mibnumberX и interfaceX и распечатывать следующий шаблон с разбросанными на них данными о том, добавляются ли два интерфейса или двести.

if [[ $authpriv = "authPriv" ]];
  then
        for ((i = 1; i <= numberofifs; i++))
    do
        printf "\ndefine service{
         service_description     Interface $interface$i
         check_command           check_snmp_V3-2!$snmpuser!$authstring!$privhash!$privstring!$authpriv!$authhash!.1.3.6.1.2.1.2.2.1.8.$mibnumber${i}!-r 1 -m RFC1213-MIB!-l Interface \n} \n\n"
    done
fi

Однако вывод этого раздела не дает такой удачи:

    $ ./test.sh
Name: Inside
 MIB number: 15
Name: Outside
 MIB Number: 16

define service{
             service_description     Interface 1
             check_command           check_snmp_V3-2!username!authpassword!AES!privpassword!authPriv!SHA!.1.3.6.1.2.1.2.2.1.8.1!-r 1 -m RFC1213-MIB!-l Interface
}

define service{
         service_description     Interface 2
         check_command           check_snmp_V3-2!username!authpassword!AES!privpassword!authPriv!SHA!.1.3.6.1.2.1.2.2.1.8.2!-r 1 -m RFC1213-MIB!-l Interface
}

Я новичок, экспериментирующий с bash, и я открыт для любых предложений.

1 ответ1

3

Если у вас есть неограниченное количество возможных записей, вы должны использовать массивы Bash в качестве структур данных, а не вводить новую переменную для каждой записи.

Все, что вам нужно сделать, это заменить строку, где вы просите имя, на это (текст сокращен для удобства чтения):

read -p "Please enter the name … press [ENTER]: " interface[$i]

Теперь $interface будет массивом, содержащим имена интерфейсов. Вы можете перебирать записи, используя типичный цикл for , где ${interface[@]} распространяется на все записи:

for name in "${interface[@]}"; do echo "$name"; done

Вы также можете легко использовать это в своих циклах for ((…)) для доступа к элементу массива с индексом $i с помощью $interface[$i] , как мы это делали при назначении имени.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .