在Perl中使用Sys:Addrr

时间:2017-03-08 19:44:34

标签: arrays perl module ip mac-address

最终目标是使用模块创建ARP侦听器和发件人。

我想替换:

my $IP = "xx.x.x.xx"; #this is an actual local ip address
my $MacAddress = "ff:ff:ff:ff:ff:ff"; # this is an actual macadd
my $LAN = "xx.x.x.xx/24"; #this has the ip and subnetmask

使用模块Sys::Addrr在每次运行程序时自动获取IP和LAN,这包括在不同的计算机上。

我已经使用cpan- https://metacpan.org/pod/Sys::HostAddr

获得了这么多代码
my $sysaddr = Sys::HostAddr->new();
my $href = $sysaddr->ip();
 foreach my $interface ( keys %{$href} ){
     foreach my $aref ( @{$href->{$interface}} ){
          print " $aref->{address}\n"; 
          print " $aref->{netmask}\n";
     }
 }

但是我不理解这个代码或结构的sytanx足以能够仅提取第一个数组引用以供使用。使用Data::Dumper我能够看到细分,注意它将我想要的地址分配到1位置,但我仍然无法提取它以供使用在该计划中。

我还注意到通过Sys::Addr无法获得MacAddress - 我假设需要另一个模块。

编辑: 运行时提取的信息是:

$VAR1 = {
          'lo' => [
                    {
                      'address' => 'x.x.x.x',
                      'netmask' => 'x.x.x.x'
                    }
                  ],
          'eth0' => [
                      {
                        'netmask' => 'x.x.x.x',
                        'address' => 'x.x.x.x'
                      }
                    ]
        };

我正在尝试提取" eth0"用于程序的两个变量中的内容。

没有此新增内容的完整代码供用户参考如下:

use strict;
use warnings;

use Net::Pcap::Easy;
use Net::Netmask;
use Net::ARP;
use Sys::HostAddr

my $IP = "x.x.x.x"; #IP Address omitted for example
my $MacAddress = "ff:ff:ff:ff:ff:ff"; #Mac Address omitted for example
my $LAN = "x.x.x.x/24"; # address omitted for example


my $parentpid = $$;
my $childpid = fork() // die "Fork Failed $!\n";

if ($childpid){
    print "perl lab6.pl $IP\n";
    print "Scanning $LAN\n";
    print "Starting parent $$ with child $childpid\n";
    print "Starting child pid $childpid\n";
    &send_loop;
    sleep 1;
    print "Killing child $childpid\n";
    kill 'KILL', $childpid;
    waitpid ($childpid, 0);
    print "Exiting parent $$\n";
    exit;
}
else {
    &cap_packs;
}

sub cap_packs{
    my $listener = Net::Pcap::Easy->new(
        dev             => "eth0",
        filter          => "arp",
        packets_per_loop    => 1,
        arp_callback        => sub {
                        my($npe,$ether,$arp,$header)=@_;
                        print "Hello";
                        if($arp->{opcode}==2){
                            my $iphex = $arp->{spa};
                            my @ip =($iphex=~/(..)(..)(..)(..)/);
                            my $ipstr = hex($ip[0]).".". hex($ip[1]).".". 
                            hex($ip[2]).".".hex($ip[3]);
                            print "Host $ipstr is alive.";
                            }
                        }
            );
    $listener->loop while 1;
}


sub send_loop{
    my $netobj = new Net::Netmask($LAN);
    for my $Remote_IP ($netobj->enumerate) {
        Net::ARP::send_packet(
            "eth0",
            $IP,
            $Remote_IP,
            $MacAddress,
            "ff:ff:ff:ff:ff:ff",
            "request");
        }
}

1 个答案:

答案 0 :(得分:0)

对于Sys::Addr我想出了如何让它正常工作。

my $sysaddr = Sys::HostAddr->new();

my $IP;
my $LAN;

my $href = $sysaddr->ip();
ints:foreach my $interface ( keys %{$href} ){
    foreach my $aref ( @{$href->{$interface}} ){
    $IP = "$aref->{address}\n";
        $LAN = "$aref->{address}:$aref->{netmask}\n";
    if ($interface eq "eth0"){last ints}
    }
}

这使我可以利用' eth0'作为一个全局变量。