最新消息:

net-snmp之利用pass做snmpget和snmpset

未分类 admin 6103浏览 0评论

前几天写了一个运维工具,用来监控夜间业务的处理情况。

虽然是生产网,但由于都是内部网络,所以决定谨慎采用snmp来获取一些信息。其中的一个需求是,根据某个指定的业务日期从远程服务器的日志中分析产生结果,然后将结果在本地监控机上呈现。

这个需求的实现有很多种方法,我这边利用 net-snmp 的扩展命令 pass 调用 shell 脚本来实现。通过 man snmpd.conf(5) 可知,net-snmp支持自定义的脚本以获取需要的信息,那就是扩展命令exec、extend 和 pass(三者的区别详见此 FAQ)。

pass命令整合了三个EXEC执行过程:

PROG -g MIBOID       — g 代表 get

PROG -n MIBOID       — n 代表 getnext

上述两条调用指令对应的功能便是 snmpget 和 snmpgetnext,PROG 表示 Shell脚本本身 。

如果你在某台监控机上执行 snmpget 命令来通过 pass 调用 shell 脚本获取信息时,shell 脚本的输出结果是有格式要求的:

输出到 stdout 的第一行必须是 MIB OID
第二行必须是 TYPE (string, integer, unsigned, objectid, timeticks, ipaddress, counter,  gauge)
第三行必须是与 TYPE 相对应的 VALUE

举个例子,假如 oid .1.3.6.1.4.100 的值是整数42,当使用自定义的脚本去获取时 ,其结果输出必须返回下面三行内容:

.1.3.6.1.4.100
integer
42

如果在获取某个oid的值时出现错误,那么脚本可以直接exit而无需向stdout输出任何的内容,net-snmp 的 snmpget 命令会自动产生noSuchName的错误。

PROG -s MIBOID TYPE VALUE       — s 代表 set

当你执行 snmpset 命令时,自定义脚本的调用格式如上所述。TYPE就是指 integer, counter, gauge, timeticks, ipaddress, objid, string。如果脚本在获取信息时没有出错,无需向stdout输出任何内容,直接exit即可;否则,需要向 stdout 输出 not-writable 或者 wrong-type。

如何开启 pass 呢? 编辑 /etc/snmp/snmpd.conf 配置文件,加入如下类似的语句:

pass  .1.3.6.1.4.1.2021.255  /bin/bash  /home/rem1x/bin/passecho
其中的 oid 是由你自己选择的,passecho是自定义的Shell脚本,通过bash调用。

一个简单的Shell脚本模板:

#!bin/bash

opt=$1
oid=$2

if [ "$opt" = "-g" ]; then
    do_the_snmpget
    ...
    echo $oid
    echo TYPE
    echo VALUE
elif [ "$opt" = "-n" ]; then
    do_the_snmpgetnext
    ...
    echo $oid
    echo TYPE
    echo VALUE
elif [ "$opt" = "-s" ]; then
    do_the_snmpset
    ...
    if_success, exit_directly
    if_fail, echo not-writable or wrong-type
fi

exit 0

转载请注明:爱开源 » net-snmp之利用pass做snmpget和snmpset

您必须 登录 才能发表评论!