Perl与SNMP

Perl与SNMP
  1. 目前SNMP的版本
    SNMPv1
    SNMPsec
    SNMPv2p
    SNMPv2c
    SNMPv2u
    SNMPv2*
    SNMPv3

  2. SNMP的数据类型

  • 整数
  • 字符串
  • 对象标识
  • 空值

SNMP所有的变量都存放在MIB(Management Information Base)中。MIB以树性结构组织。
OID(Object Identifier)是对象编号的点分格式。

  1. 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"
......
  1. 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。一般会自动响应。
  1. SNMPv2c的安全机制
    解决的是:
    “谁,做什么”的问题。
    “谁”指的就是团体串communities。它决定谁可以操作,即加入一个团体的人才有权操作。这里的团体串相当于密码。
    “做什么”指SNMP变量的属性,即ro(read-only),rw(read-write)和none之一。

  2. 通过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";
  1. 通过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";
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值