У меня есть этот логфайлПодсчитайте количество переменных комбинаций в лог-файл с помощью Perl
New connection: 141.8.83.213:64400 (172.17.0.6:2222) [session: e696835c]
2016-04-29 21:13:59+0000 [SSHService ssh-userauth on HoneyPotTransport,3,141.8.83.213] login attempt [user1/test123] failed
2016-04-29 21:14:10+0000 [SSHService ssh-userauth on HoneyPotTransport,3,141.8.83.213] login attempt [user1/test1234] failed
2016-04-29 21:14:13+0000 [SSHService ssh-userauth on HoneyPotTransport,3,141.8.83.213] login attempt [user1/test123] failed
Я хочу вывести в файл результат, как этот:
Port,Status,Occurrences
64400,failed,2
64400,failed,1
«Появления» переменная будет представлять количество комбинаций регистрационных данных [имя пользователя и пароль], которые были записаны в файл. User1 test123
видно два раза с одного и того же IP-адреса. Как я могу это сделать? Я два, пока петли на данный момент и подпрограммой вызывается внутри первого в то время как петли так:
Subroutine
sub counter(){
$result = 0;
#open(FILE2, $cowrie) or die "Can't open '$cowrie': $!";
while(my $otherlines = <LOG2>){
if($otherlines =~ /login attempt/){
($user, $password) = (split /[\s:\[\]\/]+/, $otherlines)[-3,-2];
if($_[1] =~ /$user/ && $_[2] =~ /$password/){
$result++;
}#if ip matches i think i have to do this with split
#print "TEST\n";
}
#print "Combo $_[0] and $_[1]\n";
}
#print "$result";
return $result;
}
Основной метод
sub cowrieExtractor(){
open(FILE2, $cowrie) or die "Can't open '$cowrie': $!";
open(LOG2, $path2) or die "Can't open '$path2': $!";
$seperator = chr(42);
#To output user and password of login attempt, set $ip variable to the contents of array at that x position of new
#connection to match the ip of the login attempt
print FILE2 "SourcePort"."$seperator".
"Status"."$seperator"."Occurences"."$seperator"."Malicious"."\n";
$ip = "";
$port = "";
$usr = "";
$pass = "";
$status = "";
$frequency = 0;
#Given this is a user/pass attempt honeypot logger, I will use a wide character to reduce the possibility of stopping
#the WEKA CSV loader from functioning by using smileyface as seperators.
while(my $lines = <LOG2>){
if($lines =~ /New connection/){
($ip, $port) = (split /[\[\]\s:()]+/, $lines)[7,8];
}
if($lines =~ /login attempt/){#and the ip of the new connection
if($lines =~ /$ip/){
($usr, $pass, $status) = (split /[\s:\[\]\/]+/, $lines)[-3,-2,-1];
$frequency = counter($ip, $usr, $pass);
#print $frequency;
if($ip && $port && $usr && $pass && $status ne ""){
print FILE2 join "$seperator",($port, $status, $frequency, $end);
print FILE2 "\n";
}
}
}
}
}
прямо сейчас в выходе под Occurrences
на выходе я получаю 0
, и когда я тестировал, похоже, что он исходит из того, что я инициализирую переменную $result
в подпрограмме. т.е. 0; что утверждение if внутри подпрограммы не работает должным образом. Любая помощь?
Вы не должны использовать прототипы для подпрограмм Perl. Они не делают того, что, по вашему мнению, делают. Просто 'sub counter {...}' и 'sub cowrieExtractor {...}' правильный – Borodin
* "без привлечения хэшей, если это возможно" * хэши - это именно то, что нужно для этого. Почему вы хотите их избежать? – Borodin
Я не могу не спросить: почему «без участия хешей»? И что это значит - решение, которое вообще не будет использовать хэш-тип данных? (Каковы ваши требования?) – zdim