Perl与SNMP
原创
©著作权归作者所有:来自51CTO博客作者cerana的原创作品,请联系作者获取转载授权,否则将追究法律责任
Perl与SNMP
- 目前SNMP的版本
SNMPv1
SNMPsec
SNMPv2p
SNMPv2c
SNMPv2u
SNMPv2*
SNMPv3 - SNMP的数据类型
SNMP所有的变量都存放在MIB(Management Information Base)中。MIB以树性结构组织。
OID(Object Identifier)是对象编号的点分格式。
- Net-SNMP命令行工具
官网 http://www.net-snmp.org/
snmpget -v 1 -c public solarisbox .1.3.6.1.2.1.1.1.0
snmpget -v 1 -c public solarisbox \
.iso.org.dod.internet.mgmt.mib-2.system.sysDescr.0
命令中的-v 指出版本,-c 指出团体串community
snmpwalk命令则是测试系统各种信息最有效的方法,常用的方法如下:
命令中的-v 是指版本,-c 是指团体穿community。
得到取得windows端的系统进程用户数等
$ snmpwalk -c public -v 1 -m ALL 10.0.1.52 .1.3.6.1.2.1.25.1
取得系统总内存
$ snmpwalk -c public -v 1 -m ALL 10.0.1.52 .1.3.6.1.2.1.25.2.2
取得系统用户数
$ snmpwalk -c public -v 1 -m ALL 10.0.1.52 hrSystemNumUsers
取得IP信息
$ snmpwalk -c public -v 1 -m ALL 10.0.1.52 .1.3.6.1.2.1.4.20
查看系统信息
$ snmpwalk -v 2c -c public 10.0.1.52 system
获取网卡信息
$ snmpwalk -v 1 10.0.1.52 -c public ifDescr
得到取得windows端的系统进程用户数等
$ snmpwalk -v 2c -c public 10.0.1.52 .1.3.6.1.2.1.25.1
snmpwalk功能很多,可以获取系统各种信息,只要更改后面的信息类型即可。如果不知道什么类型,也可以不指定,这样所有系统信息都获取到:
$ snmpwalk -v 2c -c public 10.0.1.52
$ snmpwalk -v 2c -c public 123.123.12.3 1.3.6.1.4.1.3902.1006.1.1.1.2.1.1.1
回显:
SNMPv2-SMI::enterprises.3902.1006.1.1.1.2.1.1.1 = No Such Object available on this agent at this OID
$ snmpwalk -v 2c -c public 123.123.12.3 1.3.6.1.4.1.3902.3.6008.2.1.1
回显:
SNMPv2-SMI::enterprises.3902.3.6008.2.1.1.1.1.5.67.116.116.121.110 = STRING: "baby"
SNMPv2-SMI::enterprises.3902.3.6008.2.1.1.1.1.5.67.109.110.101.116 = STRING: "yahoo"
Error: OID not increasing: SNMPv2-SMI::enterprises.3902.3.6008.2.1.1.1.1.5.67.116.116.121.110
>= SNMPv2-SMI::enterprises.3902.3.6008.2.1.1.1.1.5.67.109.110.101.116
$ snmpwalk -v 2c -c public 123.123.12.3 1.3.6.1.4.1.3902.3.6008.2.1.1.1.2
回显:
SNMPv2-SMI::enterprises.3902.3.6008.2.1.1.1.2.5.67.116.116.121.110 = INTEGER: 1234
SNMPv2-SMI::enterprises.3902.3.6008.2.1.1.1.2.5.67.109.110.101.116 = INTEGER: 4321
Error: OID not increasing: SNMPv2-SMI::enterprises.3902.3.6008.2.1.1.1.2.5.67.116.116.121.110
>= SNMPv2-SMI::enterprises.3902.3.6008.2.1.1.1.2.5.67.109.110.101.116
#采用对树的深度优先遍历算法。命令不给出OID则从根(.)开始。给出一个OID如下,则以相应子树(1.3.6.1.4.1.3902.1006)开始遍历。
$ snmpwalk -v 2c -c public 123.123.12.3 1.3.6.1.4.1.3902.1006
SNMPv2-SMI::enterprises.3902.1006.1.1.2.1.1.1.80.80.80.111.69.45.80.111.111.108.45.49.255.255.118.98.117.105.49.48.255.10.167839746 = STRING: "Admin-pri-1"
SNMPv2-SMI::enterprises.3902.1006.1.1.2.1.1.1.80.80.80.111.69.45.80.111.111.108.45.50.255.255.118.98.117.105.49.48.255.11.167840258 = STRING: "Admin-pri-2"
......
- SNMP常见的PDU
PDU
| 描述
|
get-request
| 是其他PDU的基础,用来获得SNMP变量的值。
|
get-next-request
| 返回指定对象之后的对象。
|
get-bulk-request
| 一次查询一组值。
|
set-request
| 修改SNMP变量的值。
|
trap/snmpV2-trap
| 要求SNMP设备主动上报事件。
|
inform-request
| 与trap类似,带上确认机制。
|
response
| 对任何PDU进行响应的PDU。一般会自动响应。
|
- SNMPv2c的安全机制
解决的是:
“谁,做什么”的问题。
“谁”指的就是团体串communities。它决定谁可以操作,即加入一个团体的人才有权操作。这里的团体串相当于密码。
“做什么”指SNMP变量的属性,即ro(read-only),rw(read-write)和none之一。 - 通过OID搜索SNMP变量
use Net::SNMP;
#提供主机名和团体串
my ($session, $error)=Net::SNMP->session(Hostname=>$ARGV[0], Community=>$ARGV[1]);
die "session error: $error" unless ($session);
#iso.org.dod.internet.mgmt.mib-2.interfaces.ifNumber.0=1.3.6.1.2.1.2.1.0
my $result=$session->get_request('1.3.6.1.2.1.2.1.0');
die 'request error: '.$session->error unless (defined $result);
$session->close();
print "Number of interfaces: ".$result->{'1.3.6.1.2.1.2.1.0'}."\n";
- 通过MIB搜索SNMP变量
use SNMP;
my $session=new SNMP::Session(DestHost=>$ARGV[0],
Community=>$ARGV[1],
Version=>'1',
UseSprintValue=>1
);
die "session creation error: $SNMP::Session::ErrorStr" unless (defined $session);
#为getnext()命令设置数据结构
my $vars=new SNMP::VarList(['ipNetToMediaNetAddress'], ['ipNetToMediaPhysAddress']);
#取出第一行
my ($ip, $mac)=$session->getnext($vars);
die $session->{ErrorStr} if ($session->{ErrorStr});
#后边的数据行
while(!$session->{ErrorStr} and
$vars->[0]->tag eq 'ipNetToMediaNetAddress'){
print "$ip->$mac\n";
($ip, $mac)=$session->getnext($vars);
}
另一个使用SNMP模块的例子
获取路由表信息:
use SNMP;
my $c=new SNMP::Session(
DestHost=>'router',
Version=>'2c',
Community=>'public'
);
my $routetable=$c->gettable('ipRouteTable');
foreach my $dest (keys %routetable){
next unless $routetable->{$dest}->{ipRouteType}==3;
print "$routetable->{$dest}->{ipRouteNextHop}\n";
}