2015-09-06 3 views
-1

У меня есть скрипт Perl, который должен сканировать до 400k строк. Иногда он останавливается без сообщения об ошибке. Как это исправить?Perl-скрипт перестает работать через некоторое время

Вот мой код, отредактированный

#!/usr/bin/perl 
# M-A_labz 

# Modules 
use HTTP::Request; 
use strict; 
use Win32::Console::ANSI; 
use warnings; 
use LWP::Simple; 
use Term::ANSIColor; 

if ($^O =~ /Win/) { 
    system("cls"); 
    system("title Mass Scripts Grabber 0.1"); 
} 
else { 
    system("clear"); 
} 

$| = 1; 
print color("red"), ' 

'; 
print color 'reset'; 

print color("yellow"), "\n\n[+] Enter List File Ips : "; 
print color 'reset'; 

my $host = <STDIN>; 
chomp($host); 

open (SITE, "<$host") || die "[-] Can't open the List of site file !"; 
my @SITE = <SITE>; 
close SITE; 

foreach my $xp (@SITE) { 
    chomp $xp; 

    my $ip = $xp; 
    chomp ($ip); 

    my %group; 

    if ($ip !~ /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/) { 
     print color("bold white"), "# Skiping $ip\n"; 
     print color 'reset'; 
    } 

    my $page = 0; 

    print color("green"), "Working on $ip\n"; 
    print color 'reset'; 
    print color("bold white"), "[#] Begin Reserving !"; 
    print color 'reset'; 

    while (1) { 
     my $content = get("http://www.bing.com/search?q=ip:$ip&count=50&first=1&FORM=PERE") 
       or die("Error getting output\n"); 

     my $status = keys %group; 

     while ($content =~ /<cite>[:\/\/]*([\w\.\-]+)[\w+\/\.\-_:\?=]*<\/cite>/g) { 
      $group{$1} = undef; 
     } 
     last if ($status == keys %group); 
     $page = $page + 10; 
    } 

    print color("bold white"), "\n# OUTPUT for $ip\n"; 
    print color 'reset'; 

    open (IN,">reverse-$ip.txt"); 
    foreach my $host (keys %group) { 
     print IN "$host\n"; 
    } 
    close(IN); 

    open (F, "<reverse-$ip.txt") 
      || die "[-] Can't open the List Of Domains Names!"; 
    my @DOMAINS = <F>; 
    close F; 

    foreach my $D (@DOMAINS) { 
     chomp $D; 
     print color("bold white"), "[-] $D :[Unknown] \n"; 
     print color 'reset'; 
    } 
} 

Как вы видите, я отсканировать до 400K IP-адресов.

Ошибка здесь, на сайте говорит, добавьте больше деталей, и я понятия не имею, что описать больше. Извините за этот бессмысленный скандал.

+0

Сообщите свой код и образец ваших данных. – stevieb

+0

Вот сценарий, проверьте http://pastebin.com/0eBsmbY0 У меня также есть похожие скрипты, но они не используют bing.com. – Bleron

+0

Пожалуйста, разместите свой код в строке, в разделе «Переполнение стека» как часть вашего вопроса. Ссылки могут устаревать. Спасибо! – FlipperPA

ответ

1

Проблема заключается в том, вероятно, что значение вашей $page переменного ничего не влияет, так что цикл while будет продолжаться бесконечно выборки тому же адреса

Возможно, вы хотели параметра first установлен в $page?

Я рекомендую использовать модуль URI вместе с URI::QueryParam, который позволит вам манипулировать частями URL отдельно. Это может выглядеть так, например

Вместо того, чтобы извлекать URL из Интернета, я просто печатаю его. Вы должны быть осторожны, чтобы у вас был надежный тест, который заставляет цикл выйти. Проблема с вашим кошельковым кодом заключается в том, что у вас нет такого теста.

Я также был бы очень удивлен, если это поведение будет соответствовать условиям обслуживания. Причина, по которой ваша преграмма вообще прекращается, вероятно, связана с тем, что Bing заметил поток идентичных автоматических запросов с вашего IP-адреса и заблокировал вас. Если вы упорствуете, то можете оказаться в беде

#!/usr/bin/perl 

use strict; 
use warnings; 
use v5.10; 

use URI; 
use URI::QueryParam; 

my $url = URI->new('http://www.bing.com/search'); 
$url->query_param(count => 50); 
$url->query_param(FORM => 'PERE'); 

my $ip = '127.0.0.1'; 
my $page = 1; 

while() { 

    $url->query_param(q  => $ip); 
    $url->query_param(first => $page); 

    say $url; 
    last if $page == 10; 

    ++$page; 
} 
Смежные вопросы