Tim Wolak am Freitag, 4. August 2006 14:07:
Hello Tim
> 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.
>
> #!/usr/bin/perl -w
>
> use strict;
> use IO::Handle;
Do you need to import this module?
> my $logfile = "/var/log/messages";
> my $secv = "/var/log/secv";
> my $hosts = "/etc/hosts.deny";
> my $cody = "/etc/hosts.txt";
Single quotes are sufficient, there's nothing to interpolate into the strings.
> 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+)/;
You put IP addresses in @boxes,
> }
> 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;
$tim also contains an IP address,
> foreach $box (@boxes) {
> if ($box =~ /$tim/){
so you can avoid the problem pointed out by JWK by replacing the regex by
if ($box eq $tim) {
> print DENY;
print DENY $_, "\n";
otherwise you'll get a one line file containing something like
11.22.33.4455.66.77.881.2.3.4 etc..
> } else {
> next;
> }
> }
> }
> close SEC;
> close DENY;
> close LOG;
I think that the nested open/close of files is not the best way. Keep actions
as local as possible, as a general rule.
[UNTESTED]:
#!/usr/bin/perl # <--
use strict;
use warnings; # <--
#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, $box);
open HOST, '<', $hosts or die "Can't open file!: $!";
push @boxes, $1 if /(\d+\.\d+\.\d+\.\d+)/
for <HOST>;
close HOST or die $!;
open LOG, '<', $logfile or die "Can't open logfile for reading: $!";
open SEC, '>', $secv or die "Can't open file!: $!";
open DENY, '>', $cody or die "Can't open file!: $!";
while (<LOG>){
if (/Failed password for invalid/) {
print SEC "Invalid user logon attempt!: $_\n";
next;
}
/(\d+\.\d+\.\d+\.\d+)/ or next;
my $tim = $1;
foreach $box (@boxes) {
($box eq $tim)
? print DENY "$_\n"
: next;
}
}
close SEC or die $!;
close DENY or die $!;
close LOG or die $!;
__END__
Dani
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>