解析 snmpwalk 输出到数组

解析 snmpwalk 输出到数组

我试图通过执行 snmpwalk 来获取网络接口,但无法在数组中分离,该变量全部存储在元素 0 中

ifname=(\$(snmpwalk -Oqv -v2c -c comm xxx.xxx.xxx.xxx 1.3.6.1.2.1.2.2.1.2))

这是在heredoc内部

我怎样才能做到这一点?

答案1

你的代码几乎可以工作了。输出:

snmpwalk -Oqv -v2c -c public (somehost) 1.3.6.1.2.1.2.2.1.2

产生所需的输出。要将其存储在数组中,请使用bashreadarray内置函数。主要的警告是,由于管道如何处理子 shell 和环境变量,因此有必要专门重定向标准输入(通常通过命令替换),而不是通过管道输入到readarray,如下所示:

readarray -t if_names < <(
  snmpwalk -Oqv -v2c -c public (somehost) 1.3.6.1.2.1.2.2.1.2
)
for i in "${!if_names[@]}"
do
    printf '%d: %s\n' "$i" "${if_names[$i]}"
done

0: public
1: vlan3
2: igb1
3: igb2
4: igb3
5: lo0
6: vm-public
7: tun0

答案2

您可能想使用snmptable(关联)代替snmpwalk

有一个教程这里

答案3

您在示例中所做的将把值设置到一个数组中,并进行一个小的修正。我必须在 $ 之前取出 escape \

bash$ ifname=($(snmpwalk -Oqv -v2c -c $comm $device 1.3.6.1.2.1.2.2.1.2))
bash$ echo ${#ifname[@]}     # how many elements in the array
58
bash$ echo ${ifname[0]}      # item at index 0
"GigabitEthernet1/1/1"
bash$ echo ${ifname[1]}      # item at index 1
"GigabitEthernet1/1/2"
bash$ echo ${ifname[5]}      # item at index 5
"GigabitEthernet1/1/6"

您可能会发现,如果 snmpwalk 的返回中有空格,则此方法不起作用。使用 IFS 将输入字段分隔符限制为换行符将有所帮助(请参阅此堆栈溢出答案我发现这对解决这个问题很有帮助)

OLDIFS="$IFS"
IFS=$'\n'      # newlines are the only separator
IN=($(my_command ...))
IFS="$OLDIFS"

相关内容