[未定义的子程序]:Net::Frame::Dump::Online:必须是 EUID 0
[ Undefined subroutine]: Net::Frame::Dump::Online: Must be EUID 0
我是 Perl 语言的新手,我正在看一本书从一些高级扫描网络开始(这就是我学习 Perl 的原因)
程序看起来像这样:
#!/usr/bin/perl -w
use strict;
use Net::Pcap qw( :functions );
use Net::Frame::Device;
use Net::Netmask;
use Net::Frame::Dump::Online;
use Net::ARP;
use Net::Frame::Simple;
my $err = "";
my $dev = pcap_lookupdev($err); # from Net::Pcap
my $devProp = Net::Frame::Device->new(dev => $dev);
my $ip = $devProp->ip;
my $gateway = $devProp->gatewayIp;
my $netmask = new Net::Netmask($devProp->subnet);
my $mac = $devProp->mac;
my $netblock = $ip . ":" . $netmask->mask();
my $filterStr = "arp and dst host ".$ip;
my $pcap = Net::Frame::Dump::Online->new(
dev => $dev,
filter => $filterStr,
promisc => 0,
unlinkOnStop => 1,
timeoutOnNext => 10 # waiting for ARP responses
);
$pcap->start;
print "Gateway IP: ",$gateway,"\n","Starting scan\n";
for my $ipts ($netmask->enumerate){
Net::ARP::send_packet(
$dev,
$ip,
$ipts,
$mac,
"ff:ff:ff:ff:ff:ff", # broadcast
"request");
}
until ($pcap->timeout){
if (my $next = $pcap->next){ # frame according to $filterStr
my $fref = Net::Frame::Simple->newFromDump($next);
# we don’t have to worry about the operation codes 1, or 2
# because of the $filterStr
print $fref->ref->{ARP}->srcIp," is alive\n";
}
}
END{ print "Exiting\n"; $pcap->stop; }
然而,当我 运行 ./script.pl
我收到这个错误:
Undefined subroutine &main::pcap_lookupdev called at ./scan_ARP.pl line 13.
Exiting
Can't call method "stop" on an undefined value at ./scan_ARP.pl line 48.
END failed--call queue aborted.
并且如书中所述,我可以将 my $dev = pcap_lookupdev($err);
直接替换为 my $dev = "wlp0s20f3"
(wlp0s20f3;是我的网络接口的名称),但是当我这样做时,我得到:
[-]: Net::Frame::Dump::Online: Must be EUID 0 (or equivalent) to open a device for live capture
Exiting
Can't kill a non-numeric process ID at /usr/share/perl5/Net/Frame/Dump/Online.pm line 363.
END failed--call queue aborted.
所以我发现要解决这个问题,我必须 运行 脚本作为 root。
我是 Perl 语言的新手,我正在看一本书从一些高级扫描网络开始(这就是我学习 Perl 的原因)
程序看起来像这样:
#!/usr/bin/perl -w
use strict;
use Net::Pcap qw( :functions );
use Net::Frame::Device;
use Net::Netmask;
use Net::Frame::Dump::Online;
use Net::ARP;
use Net::Frame::Simple;
my $err = "";
my $dev = pcap_lookupdev($err); # from Net::Pcap
my $devProp = Net::Frame::Device->new(dev => $dev);
my $ip = $devProp->ip;
my $gateway = $devProp->gatewayIp;
my $netmask = new Net::Netmask($devProp->subnet);
my $mac = $devProp->mac;
my $netblock = $ip . ":" . $netmask->mask();
my $filterStr = "arp and dst host ".$ip;
my $pcap = Net::Frame::Dump::Online->new(
dev => $dev,
filter => $filterStr,
promisc => 0,
unlinkOnStop => 1,
timeoutOnNext => 10 # waiting for ARP responses
);
$pcap->start;
print "Gateway IP: ",$gateway,"\n","Starting scan\n";
for my $ipts ($netmask->enumerate){
Net::ARP::send_packet(
$dev,
$ip,
$ipts,
$mac,
"ff:ff:ff:ff:ff:ff", # broadcast
"request");
}
until ($pcap->timeout){
if (my $next = $pcap->next){ # frame according to $filterStr
my $fref = Net::Frame::Simple->newFromDump($next);
# we don’t have to worry about the operation codes 1, or 2
# because of the $filterStr
print $fref->ref->{ARP}->srcIp," is alive\n";
}
}
END{ print "Exiting\n"; $pcap->stop; }
然而,当我 运行 ./script.pl
我收到这个错误:
Undefined subroutine &main::pcap_lookupdev called at ./scan_ARP.pl line 13.
Exiting
Can't call method "stop" on an undefined value at ./scan_ARP.pl line 48.
END failed--call queue aborted.
并且如书中所述,我可以将 my $dev = pcap_lookupdev($err);
直接替换为 my $dev = "wlp0s20f3"
(wlp0s20f3;是我的网络接口的名称),但是当我这样做时,我得到:
[-]: Net::Frame::Dump::Online: Must be EUID 0 (or equivalent) to open a device for live capture
Exiting
Can't kill a non-numeric process ID at /usr/share/perl5/Net/Frame/Dump/Online.pm line 363.
END failed--call queue aborted.
所以我发现要解决这个问题,我必须 运行 脚本作为 root。