On Fri, 2006-08-04 at 14:46 +0200, D. Bolliger wrote:
> 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
>
Thanks Dani,
I have modified the code however its still not writting to the file....
Not sure what is going on, I have tried different ideas to get it to
pint to the file but so far no go. Does anyone have any ideas?
#!/usr/bin/perl -w
use strict;
use warnings;
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 or die $!;
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 eq /$tim/){
next;
} else {
print DENY "$tim\n";
}
}
}
close SEC or die $!;
close DENY or die $!;
close LOG or die $!;
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>