天天看點

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
  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);
}      
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";
}