这是一些Perl代码,它将两个文件作为输入。这些文件包含TCP数据包。它使用第一个文件中的数据包训练正常数据包,然后在第二个文件中打印异常数据包。如何打印文件中所有输入的计算得分?
while (<>) {
if (($time, $to, $port, $from, $duration, $flags, $length, $text) = /(.{19}) (.{15}):(\d+) (.{15}):\d+ \+(\d+) (\S+) (\d+) (.*)/) {
$text =~ s/\^M//g;
$text =~ s/\^ /\n/g;
if (($port == 25 || $port == 80) && $text =~ /\n\n/) {$text = "$`\n";}
$text =~ s/^\^@//;
if ($time =~ /(\d\d)\/(\d\d)\/\d\d\d\d (\d\d):(\d\d):(\d\d)/) {
$now = ((($1 * 31 + $2) * 24 + $3) * 60 + $4) * 60 + $5;
}
foreach ($text =~ /.*\n/g) {
if (($k, $v) = /(\S*)(.*)/) {
$k = substr($k, 0, 30);
$v = substr($v, 0, 100);
$score = 0;
$comment = "";
&alarm($port, $k);
&alarm($to, $flags);
&alarm("To", "$to:$port");
&alarm($to, $from);
&alarm("$to:$port", $from);
if ($score > 30000) {
$score = log($score)/(10 * log(10));
printf(" # 0 $time $to %8.6f \#%s\n", $score, substr($comment, 0, 300));
}
}
}
}
}
sub alarm {
local ($key, $val, $sc) = @_;
if ($now < 10300000) {
++$n{$key};
if (++$v{$key . $val} == 1) {
++$r{$key};
$t{$key} = $now;
}
} elsif ($n{$key} > 0 && !$v{$key . $val}) {
$score += ($now - $t{$key}) * $n{$key}/$r{$key};
$comment .= " $key=$val";
$t{$key} = $now;
}
}
exit;
我是新来的Perl和一小部分,我的项目,它需要的是一个异常分数将被打印在第二个文件中的所有数据包。任何人都可以告诉如何修改代码?
你寻求帮助与算法,或者只是询问如何打印值出来吗? – 2011-04-30 04:33:18
我只需要打印出每个数据包的分数值,而不仅仅是用于某些数据包...... – 2011-04-30 04:47:46