Snmpwalk Linux Bash不返回数组

时间:2013-08-28 10:48:27

标签: linux bash shell snmp esx

我在opensuse linux上运行nagios服务器,通过snmp链接到esx 3.5服务器

我试图让snmpwalk返回一个数组,但它只返回一个值。

在esx框中,我使用以下shell来查找所有快照的大小 -

/usr/bin/find /vmfs/volumes/ -name '*delta*.vmdk' -printf %f' '%s'\n' 

在esx框上运行时返回以下内容 -

[root@localhost root]# /bin/sh /etc/snmp/snmp_snapshots.sh
testnag01-000001-delta.vmdk 16840704
testnag01-000002-delta.vmdk 167835648
testnag01-000003-delta.vmdk 151058432

在nagios框中,我有以下shell -

declare -a RESULT=$(/usr/bin/snmpwalk -v 2c -c public 10.10.0.20 .1.3.6.1.4.1.6876.57.101.2 | grep vmdk | awk {' print $4,$5 '} | sed 's/ /_size:/g' | sed 's/\"//g')

echo "snapshot 1" ${RESULT[0]}
echo "snapshot 2" ${RESULT[1]}

这只返回一个值(列表中的第二个) -

snapshot 1 testnag01-000002-delta.vmdk:167835648
snapshot 2

当我自己运行命令时 -

/usr/bin/snmpwalk -v 2c -c public 10.10.0.20 .1.3.6.1.4.1.6876.57.101.2

我收到以下回复 -

SNMPv2-SMI::enterprises.6876.57.101.2 = STRING: "testnag01-000002-delta.vmdk 167835648"

所以看起来命令本身无法返回多个结果?

我在这里是个菜鸟,所以我很可能会错过一些明显的东西......

提前致谢

2 个答案:

答案 0 :(得分:1)

我在其他地方得到了答案,但我想我会在这里发布,以防其他人有同样的问题 -

OID中的最后一个数字返回记录号 - 所以.2返回第二个值

一旦我删除了.2并使用了这个命令 -

/ usr / bin / snmpwalk -v 2c -c public 10.10.0.20 .1.3.6.1.4.1.6876.57.1​​01

它工作正常!

答案 1 :(得分:0)

您忘了将值放在():

declare -a RESULT=($(/usr/bin/snmpwalk -v 2c -c public 10.10.0.20 .1.3.6.1.4.1.6876.57.101.2 | grep vmdk | awk {' print $4,$5 '} | sed 's/ /_size:/g' | sed 's/\"//g'))

为防止可能的pathname expansion,建议改为使用read

declare -a RESULT
IFS=$' \t\n' read -rd '' -a RESULT < <(/usr/bin/snmpwalk -v 2c -c public 10.10.0.20 .1.3.6.1.4.1.6876.57.101.2 | grep vmdk | awk {' print $4,$5 '} | sed 's/ /_size:/g' | sed 's/\"//g')

如果您要逐行阅读,请使用readarrayprocess substitution

readarray -t RESULT < <(/usr/bin/snmpwalk -v 2c -c public 10.10.0.20 .1.3.6.1.4.1.6876.57.101.2 | grep vmdk | awk {' print $4,$5 '} | sed 's/ /_size:/g' | sed 's/\"//g')

here stringscommand substitution

readarray -t RESULT <<< "$(/usr/bin/snmpwalk -v 2c -c public 10.10.0.20 .1.3.6.1.4.1.6876.57.101.2 | grep vmdk | awk {' print $4,$5 '} | sed 's/ /_size:/g' | sed 's/\"//g')"

您也可以使用while read循环:

declare RESULT=()
while read -r LINE; do
    RESULT[${#RESULT[@]}]=$LINE
done < <(/usr/bin/snmpwalk -v 2c -c public 10.10.0.20 .1.3.6.1.4.1.6876.57.101.2 | grep vmdk | awk {' print $4,$5 '} | sed 's/ /_size:/g' | sed 's/\"//g')

更简单的命令方法是:

/usr/bin/snmpwalk -v 2c -c public 10.10.0.20 .1.3.6.1.4.1.6876.57.101.2 | awk -F '"' '/vmdk/{ t = $2; sub(/ /, "_size:", t); print t; }'