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