2011-04-13 114 views
3

爲了我的實習,我必須編碼網絡主管。我正在寫perl腳本以從交換機上的接口名稱查找所有信息(速度,mac地址,雙工...)。 該模塊中有一個「ifPhysAddress」函數,但它返回交換機接口的mac地址,而不是與其連接的設備的mac地址。 我如何找到mac地址? 感謝Perl&Net :: SNMP :: Interfaces ::詳細信息,如何獲取mac地址?

這裏是我已經開始:

#!/usr/bin/perl 
use strict; 
use warnings; 
use Getopt::Long; 
use SnmpTable; 
use Net::MAC; 
use Net::SNMP; 
use Net::SNMP::Interfaces; 

my $ifname; 
my $hostname; 
my $community; 
my $version = 1; 

GetOptions("ifname=s"  => \$ifname, 
      "host=s"  => \$hostname, 
      "community=s" => \$community, 
      "protocol:s" => \$version); 

my $interfaces = Net::SNMP::Interfaces->new(Hostname => $hostname, Community => $community); 
my $inter = $interfaces->interface($ifname); 

#On récupere l'identifiant de l'interface $ifname 
my $ifindex = $inter->index(); 
#Vitesse 
my $vitesse = $inter->ifHighSpeed(); 
#Alias 
my $ifalias = $inter->ifAlias(); 


#Recherche des VLANs 
my $numeroportbridge; 
my $vlan_trouve; 

my $oid_cisco_vlans = "1.3.6.1.4.1.9.9.46.1.3.1.1.2.1"; 
my $vlans = SnmpTable->new($hostname, $oid_cisco_vlans, $community); 
$vlans->connexion(); 
my %vl = $vlans->requete(); 
my @tab = keys(%vl); 

foreach my $i (@tab) { 
    if ($i<1000) { 
     my $comvlan = $community."@".$i; 
     print $comvlan."\n"; 
    } 
} 
printf "Nom de l'interface : %s --> ifindex = %s, Vitesse = %s, Alias = %s\n", $ifname, $ifindex, $vitesse, $ifalias; 

回答

1

您需要按照一定的網絡拓撲算法。

爲了找到主機和交換機/路由器之間的連接,您必須先從主機獲取子網信息。然後找出從哪個交換機創建子網。如果在該子網中找到交換機,則主機連接到該交換機。

  1. 查找的ifIndex爲您操作界面採用ifTable的
    - > 53
  2. 使用ipRouteTable獲取ipRouteDest。它會得到一些IP地址。這是表格的主要關鍵。
    - > 10.0.0.1,192.168.1.1,8.8.8.1
  3. 現在,找到的ifIndex使用ipRouteIfIndex +每一跳 「IP在步驟2中發現」它會得到每個跳躍的索引。
    - > 1.3.6.1.2.1.4.21.1.2(ipRouteIfIndex)+10.0.0.1 = 1.3.6.1.2.1.4.21.1.2.10.0.0.1
    - >在步驟3中的查詢的響應,你會得到如果該IP的索引。匹配來自第一步的索引。對應的IP將是該接口的IP。您可以通過直接查詢該IP來獲得MAC。

謝謝。

+0

好吧,我明白了,但我不知道主機。我想調用我的腳本: - switch ip - community - 接口名稱(例如FastEthernet0/9) 我想讓他回答:在這個接口上Fa0/9連接到「主機的IP」 ,速度:100,雙面打印:全... – eouti 2011-04-13 12:09:42

+0

好的。然後找到從接口Fa0/9創建的子網。從該子網生成全部256個IP地址。 Ping所有IP並找到活的IP。然後在我的答案中匹配條件。 – nIKUNJ 2011-04-13 12:15:12

+0

對不起,我犯了一個錯誤,我不在乎主機的IP,我更喜歡主機的MAC。它更容易嗎?謝謝。 – eouti 2011-04-13 12:36:17

1

好吧,我發現怎麼辦,如果有人需要做...

#We get the index of $ifname 
my $ifindex = $inter->index(); 
#Speed 
my $vitesse = $inter->ifHighSpeed(); 
#Alias 
my $ifalias = $inter->ifAlias(); 
#Finding VLANs 
my $vlan_trouve; 

#Listing all VLANs on the switch 
my $vmVlan = "1.3.6.1.4.1.9.9.68.1.2.2.1.2"; 
my $vlans = SnmpTable->new($hostname, $vmVlan, $community); 
$vlans->connexion(); 
my %vl = $vlans->requete(); 

#Getting the good VLAN 
$vlan_trouve = $vl{$ifindex}; 

#Listing ports of VLAN <-> @mac 
my $dot1dTpFdbAddress = "1.3.6.1.2.1.17.4.3.1.1"; 
my $dot = SnmpTable->new($hostname, $dot1dTpFdbAddress, $community."@".$vlan_trouve); 
$dot->connexion(); 
my %dot1address = $dot->requete(); 

#Listing numPortBridge <-> ports of VLAN 
my $dot1dTpFdbPort = "1.3.6.1.2.1.17.4.3.1.2"; 
my $dot2 = SnmpTable->new($hostname, $dot1dTpFdbPort, $community."@".$vlan_trouve); 
$dot2->connexion(); 
my %portdot = reverse($dot2->requete()); 

#Listing num Port bridge <-> ID port switch 
my $dot1dBasePortIfIndex = "1.3.6.1.2.1.17.1.4.1.2"; 
my $dot3 = SnmpTable->new($hostname, $dot1dBasePortIfIndex, $community."@".$vlan_trouve); 
$dot3->connexion(); 
my %dotindex = reverse($dot3->requete()); 

my $numportbridge = $dotindex{$ifindex}; 
if (!defined($numportbridge)) { 
    print "Erreur : $ifindex non trouvé dans la liste : num Port bridge <-> ID port switch\n"; 
    exit 2; 
} 
my $portVlan = $portdot{$numportbridge}; 
if (!defined($portVlan)) { 
    print "Erreur : $numportbridge non trouvé dans la liste : numPortBridge <-> ports du VLAN\n"; 
    exit 3; 
} 
my $add = $dot1address{$portVlan}; 
if (!defined($add)) { 
    print "Erreur : $portVlan non trouvé dans la liste : ports du VLAN <-> \@mac\n"; 
    exit 4; 
} 
$add =~ s/0x//g; 
printf "Interface : $ifname sur $hostname <=> ifindex : $ifindex sur VLAN : $vlan_trouve <=> \@mac : $add\nVitesse=$vitesse, Alias=$ifalias, Duplex=--\n"; 

我創建了一個類SnmpTable.pm,使用的Net :: SNMP,它只是做:
$會議 - > get_table(-baseoid => $ this - > {oid})
並以散列形式返回它。

就是這樣。 再見。

+0

你碰巧擁有你的SnmpTable.pm源代碼嗎?一直在努力創造一個,但我做錯了什麼。 – elysch 2017-07-10 14:51:29