自从我重新开始编程以来,这个网站提供了很大的帮助,我正在尝试编写一个简单的 perl 脚本,该脚本将分析目录(多个域)中的 apache 日志文件,提取每个日志文件的最后 1000 行,从日志文件中删除 IP 地址,然后将它们与已知的垃圾邮件发送者阻止列表进行比较。
现在到目前为止,除了一个问题外,我已经让脚本正常工作了。假设我在两个日志文件中有 IP 地址 10.128.45.5,脚本当然会依次分析每个日志文件,并将 IP 减少到一个 PER 日志文件,但我想要做的是将其缩小到更多每个实例一个我运行此脚本,无论多个日志文件中是否出现相同的 IP。
这是我到目前为止得到的代码,如果有点乱,请见谅。
#!/usr/bin/perl
# Extract IP's from apache access logs for the last hour and matches with forum spam bot list.
# The fun work of Daniel Pearson
use strict;
use warnings;
use Socket;
# Declarations
my ($file,$list,@files,%ips,$match,$path,$sort);
my $timestamp = localtime(time);
# Check to see if matching file exists
$list ='list';
if (-e $list) {
Delete the file so we can download a new one if it exists
print "File Exists!";
print "Deleting File $list\n";
unlink($list);
}
sleep(5);
system ("wget http://www.domain.com/list");
sleep(5);
my $dir = $ARGV[0] or die "Need to specify the log file directory\n";
opendir(DIR, "$dir");
@files = grep(/\.*$/,readdir(DIR));
closedir(DIR);
foreach my $file(@files) {
my $sum = 0;
if (-d $file) {
print "Skipping Directory $file\n";
}
else {
$path = "$dir$file";
open my $path, "-|", "/usr/bin/tail", "-1000", "$path" or die "could not start tail on $path: $!";
my %ips;
while (my $line = <$path>) {
chomp $line;
if ($line =~ m/(?!0+\.0+\.0+\.0+$)(([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5]))/g) {
my $ip = $1;
$ips{$ip} = $ip;
}
}
}
foreach my $key (sort keys %ips) {
open ("files","$list");
while (my $sort = <files>) {
chomp $sort;
if ($key =~ $sort) {
open my $fh, '>>', 'banned.out';
print "Match Found we need to block it $key\n";
print $fh "$key:$timestamp\n";
close $fh;
}
}
}
}
任何可以提供的建议我都会感激不尽。