這是一些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