Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Системное программирование > Дублирование элементов массива


Автор: DiverD 19.1.2006, 03:57
Вот код
Код

#!/usr/bin/perl
use strict;
use warnings;
our $httpd_a = '/var/log/httpd-access.log';
our $time = 2; 
our $logdir = '/tmp/log';
# access.log
sub httpd_acc {
our $drazm = (stat($httpd_a))[7];

open(HTTPD_ACC,"<$httpd_a");
my @list_acc = <HTTPD_ACC>;
#while (<HTTPD_ACC>) {
#push @list_acc, $_ if /netstat.|ps.aux|sockstat|id|who|ls./;
#}
close(HTTPD_ACC);

while(sleep($time))
{
my $mrazm = (stat($httpd_a))[7];
if ($mrazm > $drazm) {
open(NEW_LOG,"<$httpd_a");
my @new_acc = ();
while (<NEW_LOG>) {
push @new_acc, $_ if /netstat/g;
}
close(NEW_LOG);
my (%seen,@aonly,$item);
@seen{@list_acc} = ();
foreach $item (@new_acc) {
push (@aonly,$item) unless exists $seen{$item};
}
$drazm = $mrazm;

open(NLOG,">>$logdir/access.log");
print NLOG join "\n","@aonly";
close(NLOG);
}
}
}
httpd_acc();


#Вот результат выполнения:
access.log:

127.0.0.1 - - [19/Jan/2006:02:47:10 +0200] "GET /shel.php?cmd=netstat HTTP/1.1" 200 3799 "http://127.0.0.1/shel.php?cmd=ps+ax" "Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.7.7) Gecko/20050420"
127.0.0.1 - - [19/Jan/2006:02:47:10 +0200] "GET /shel.php?cmd=netstat HTTP/1.1" 200 3799 "http://127.0.0.1/shel.php?cmd=ps+ax" "Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.7.7) Gecko/20050420"
127.0.0.1 - - [19/Jan/2006:02:47:12 +0200] "GET /shel.php?cmd=id HTTP/1.1" 200 248 "http://127.0.0.1/shel.php?cmd=netstat" "Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.7.7) Gecko/20050420"
127.0.0.1 - - [19/Jan/2006:02:47:10 +0200] "GET /shel.php?cmd=netstat HTTP/1.1" 200 3799 "http://127.0.0.1/shel.php?cmd=ps+ax" "Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.7.7) Gecko/20050420"
127.0.0.1 - - [19/Jan/2006:02:47:12 +0200] "GET /shel.php?cmd=id HTTP/1.1" 200 248 "http://127.0.0.1/shel.php?cmd=netstat" "Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.7.7) Gecko/20050420"
127.0.0.1 - - [19/Jan/2006:02:47:10 +0200] "GET /shel.php?cmd=netstat HTTP/1.1" 200 3799 "http://127.0.0.1/shel.php?cmd=ps+ax" "Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.7.7) Gecko/20050420"
127.0.0.1 - - [19/Jan/2006:02:47:12 +0200] "GET /shel.php?cmd=id HTTP/1.1" 200 248 "http://127.0.0.1/shel.php?cmd=netstat" "Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.7.7) Gecko/20050420"

#Вот результат логов apache httpd-access.log:

127.0.0.1 - - [19/Jan/2006:02:47:06 +0200] "GET /shel.php?cmd=ps+ax HTTP/1.1" 200 4979 "http://127.0.0.1/shel.php?cmd=ps" "Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.7.7) Gecko/20050420"
127.0.0.1 - - [19/Jan/2006:02:47:10 +0200] "GET /shel.php?cmd=netstat HTTP/1.1" 200 3799 "http://127.0.0.1/shel.php?cmd=ps+ax" "Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.7.7) Gecko/20050420"
127.0.0.1 - - [19/Jan/2006:02:47:12 +0200] "GET /shel.php?cmd=id HTTP/1.1" 200 248 "http://127.0.0.1/shel.php?cmd=netstat" "Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.7.7) Gecko/20050420"
127.0.0.1 - - [19/Jan/2006:02:47:15 +0200] "GET /shel.php?cmd=who HTTP/1.1" 200 433 "http://127.0.0.1/shel.php?cmd=id" "Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.7.7) Gecko/20050420"
127.0.0.1 - - [19/Jan/2006:02:47:20 +0200] "GET /shel.php?cmd=man+man HTTP/1.1" 200 6402 "http://127.0.0.1/shel.php?cmd=who" "Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.7.7) Gecko/20050420"
[/code]

Как видно мой логфайл access.log дублирует в отличии от apache. где моя ошибка?
PS: скрипт по задумке должен записывать толька те строки и в оригинале в которых присуцтвует "netstat"

Автор: saint 19.1.2006, 16:25
строка 25: push @new_acc, $_ if /netstat/g;

попробуй убрать "g" в конце регекспа:

Код

push @new_acc, $_ if /netstat/;


а вообще строку можно сократить до:

Код

push @new_acc if /netstat/;


smile

Автор: DiverD 19.1.2006, 19:48
пофигу с глобалам или без - серавно не работает

Автор: DiverD 19.1.2006, 21:29
ВСЕ проблема решена.
ps: вас пока дождешьсяsmile

Автор: BlackLFL 20.1.2006, 10:14
так напишете, как решили проблему ...

Автор: DiverD 20.1.2006, 14:23
BlackLFL
колупался 2 часа все думал думал но ни делалsmile там где идет дописывание проста поставить на запись вместо >> поставить > smile
Кстати если есть идеи прошу высказать..

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)