On Thu, 2006-08-03 at 15:26 -0700, John W. Krahn wrote:
> Rob Dixon wrote:
> >
> > Tim Wolak wrote:
> >>
> >> if($box =~ m/"$tim"/){
> >
> > Do you intend the quotes? If the lines from the original hosts.deny file
> > (in @boxes) have IP addresses in quotes then you're OK, but otherwise
> > take them out. This is my best guess as to why your code isn't working.
> > Also, you really need to escape the dots in $tim, otherwise they'll match
> > any character instead of literal dots.
> >
> > if ($box =~ /\Q$tim/) {
>
> That won't work correctly either. If $box contains '1.2.3.45' and $tim
> contains '1.2.3.4' then they will "match" although they aren't the same IP
> address.
>
>
> John
> --
> use Perl;
> program
> fulfillment
>
John is patially right, it will match but if its close it will match it
also. Another problem if I try to print the IP to a file it does not do
that either. Below is the changed code:
#!/usr/bin/perl -w
use strict;
use IO::Handle;
my $logfile = "/var/log/messages";
my $secv = "/var/log/secv";
my $hosts = "/etc/hosts.deny";
my $cody = "/etc/hosts.txt";
my @boxes;
my $box;
open(LOG, $logfile) || die "Cannot open logfile for reading: $!";
open(SEC, ">$secv") || die "Can't open file!: $!";
open(HOST, $hosts) || die "Can't open file!: $!";
open(DENY, ">$cody") || die "Can't open file!: $!";
foreach (<HOST>) {
push @boxes, $1 if /(\d+\.\d+\.\d+\.\d+)/;
}
close HOST;
while (<LOG>){
next unless /Failed password for invalid/;
print SEC "Invalied user logon attempt!:$_\n";
next unless /(\d+\.\d+\.\d+\.\d+)/;
my $tim = $1;
foreach $box (@boxes) {
if ($box =~ /$tim/){
print DENY;
} else {
next;
}
}
}
close SEC;
close DENY;
close LOG;
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>