不知道为什么停不下来,坑爹。。
#!/usr/bin/perl
use threads;
use Thread::Queue;
use Thread::Semaphore;
use Net::Ping;
# create queue
my $q=new Thread::Queue;
# read for check list
my @target=<>;
my $se_max = Thread::Semaphore->new( 100 );
foreach my $ip (@target){
chomp($ip);
foreach my $port(1..65535){
$q->enqueue("$ip|$port");
}
}
while(1){
foreach(threads->list(threads::joinable))
{
$_->join();
}
my $item = $q->pending();
if( $item == 0 )
{
my $active = threads->list(threads::running);
if($active == 0)
{
print "全部跑完\n";
last;
}
else
{
next;
}
}
$se_max->down;
threads->create(\&nex,$q->dequeue());
}
foreach(threads->list()){
$_->join();
}
sub nex{
local($tmp)=shift;
@list=split(/\|/,$tmp);
$scan=Net::Ping->new('syn');
$scan->port_number($list[1]);
$scan->ping($list[0]);
if($scan->ack){
print "ip:$list[0] port:$list[1] open\n";
}
$scan->close();
$se_max->up;
}