Forum Webscript.Ru
		Программирование => Perl => Тема начата: Sergo_stavropol от 27 Сентября 2002, 14:08:07
		
			
			- 
				Друзья, хелп!
 Что-то я окончательно запутался во множестве примеров, а нужно решить элементарнейшую задачу.  Решил, что лучше спросить всего один раз у знающих людей, чем лопаптить инет.
 
 В общем, нужно определить ip посетителя и записать ip в файл
 Насчет определить ip понятно, с файлом мучаюсь
 
 #!/usr/bin/perl
 $ip=$ENV{\'\'REMOTE_ADDR"};
 
 а дальше как быть?
 
 огромное все спасибо!!!!!!
- 
				#!/usr/bin/perl
 use strict;
 
 my $ip=$ENV{\'\'REMOTE_ADDR"};
 my $counterfile=\'ip.txt\';
 
 print "Content-type: text/html\\n\\n";
 
 open (CF,">$counterfile")|| die "Не могу записать в каунтерфайл: $!";
 print CF $ip;
 close(CF);
- 
				
 open (CF,">$counterfile")|| die "Не могу записать в каунтерфайл: $!";
 
 
 
 Если нужно кучу IP записать в один файл, то наверное правильнее ( хм... куда уж правильнее :D ) было бы append\'ить:
 
 open (CF,">>$counterfile")|| die "Не могу записать в каунтерфайл: $!";
 
- 
				куда уж правильнее  
 из вопроса это не следует.
- 
				2NeoNox:
 
 Цитата:
 куда уж правильнее
 
 из вопроса это не следует.
 
 
 Никакого наезда на вопрос и ответ, если он [наезд] там просматривается. :-|
- 
				mike :D. Тебе показалось. Все Ок!
 Я лишь сказал, что задача поставлена так:
 нужно определить ip посетителя и записать ip в файл 
- 
				Спасибо!
 Да, я действительно не сказал, что нужно было кучу ip записать, а это дейтсвительно так
 Более того, хотелось бы ip заносить в новую строчку при каждом новос коннекте (даже если это тот же самый ip)
 Сорри что сразу не сформулировал сразу правильно задачу. Если можно,  подскажите плиз еще и это :)
 
 Заранее БЛГДРН.
- 
				В общем, чтобы было совсем уж конкретно, попрошу перевести нижеприведенный php-скрипт в cgi-скрипт 
 
 $ip = getenv(\'REMOTE_ADDR\');
 $host = gethostbyaddr($ip);
 $date=date(\'d-m- Y, H:i:s\');
 $os=$HTTP_USER_AGENT;
 $lf=fopen("logzzz",\'a\');
 fwrite($lf,"\\n  $date   $ip   $host   $os");
 $lf=fclose($lf);
 
 
 мужики, с меня :beer:  :)
- 
				#!/usr/bin/perl
 
 use CGI::Carp qw(fatalsToBrowser);
 
 $counterfile = "log.txt"; #Файл, куда это добро сваливается
 
 # Снимаем текущую дату \'d-m- Y, H:i:s\'
 ($second,$minute,$hour,$day,$month,$year,$weekday) = (localtime(time))[0,1,2,3,4,5,6];
 $year +=1900;
 if ($minute < 10) {$minute = "0"."$minute";}
 if ($second < 10) {$second = "0"."$second";}
 if ($hour eq "0") {$hour = "12";}
 if ($month < "10") {$month = "0".$month}
 if ($day < "10") {$day = "0".$day}
 $time = "$day-$month-$year, $hour-$minute-$second";
 
 # Снимаем всякие переменные окружения
 $ip = $ENV{\'REMOTE_ADDR\'};
 @digits = split (/\\./, $ip);
 $address = pack ("C4", @digits);
 $host = gethostbyaddr ($address, 2);
 
 $language = $ENV{\'HTTP_ACCEPT_LANGUAGE\'};
 $http_referer = $ENV{\'HTTP_REFERER\'};
 $remote_addr = $ENV{\'REMOTE_ADDR\'};
 $http_user_agent =  $ENV{\'HTTP_USER_AGENT\'};
 $request_uri =  $ENV{\'REQUEST_URI\'};
 if ($ENV{\'HTTP_REFERER\'} eq "") {$http_referer = "None";}
 
 print "Content-type: text/html\\n\\n";
 
 $log_vars = "$time|$remote_addr|$http_user_agent|$request_uri|$http_referer|$language|$host \\n";
 
 open (CF,">>$counterfile")|| die "Не могу записать в каунтерфайл: $!";
 print CF $log_vars;
 close(CF);
 
 Разделители между значениями "|"
- 
				> $time = "$day-$month-$year, $hour-$minute-$second";
 
 И получаем "28-08-2002, 9-27-17", а на дворе осень...
- 
				Огромное всем спаибо!!! 
 Все пошло!!
 :beer:
 :beer:
 :beer:
- 
				И получаем "28-08-2002, 9-27-17", а на дворе осень... 
 [OFF]
 Не может быть! У нас в Киеве лето :)
 [/OFF]
 Sergo_Stavropol, поправь код. Лажанулся я...
 
 
 # Снимаем текущую дату \'d-m- Y, H:i:s\'
 ($second,$minute,$hour,$day,$month,$year,$weekday) = (localtime(time))[0,1,2,3,4,5,6];
 $year +=1900;
 $month++;
 if ($minute < 10) {$minute = "0"."$minute";}
 if ($second < 10) {$second = "0"."$second";}
 if ($hour eq "0") {$hour = "12";}
 if ($month < "10") {$month = "0".$month}
 if ($day < "10") {$day = "0".$day}
 $time = "$day-$month-$year, $hour-$minute-$second";
 
- 
				Спасибо еще раз тов. NeoNox!
 Все великолепно работает.
 Только по пути как обычно возникают еще вопросы: например, как сделать так,  чтобы новая запись в каунтерфайл выводилась в начале списка?
 
 Заранее БЛГДРН.
 
 PS Чувствую, надо регаться. Форум классный,  реальная помощь чайникам. :) :beer:
- 
				Только по пути как обычно возникают еще вопросы: например, как сделать так, чтобы новая запись в каунтерфайл выводилась в начале списка?  
 С этим посложнее будет, т.к. нужно сначала создавать временный файл, писать в начало нужную строку, дописывать старое... А это - тормоза. Так ли нужно это в логе?
 
 2NeoNox: из чисто академического интереса такой вопрос. Есть код
 if ($minute < 10) {$minute = "0"."$minute";}
 if ($second < 10) {$second = "0"."$second";}
 if ($hour eq "0") {$hour = "12";}
 if ($month < "10") {$month = "0".$month}
 if ($day < "10") {$day = "0".$day}
 $time = "$day-$month-$year, $hour-$minute-$second";
 
 
 Здесь sprintf не используется из соображений скорости, безопасности? Т.к. гораздо приятнее было бы
 
 if ($hour == 0) {$hour = 12}
 $time = sprintf "%02d-%02d-%04d, %02d-%02d-%02d",
 $day,$month,$year,$hour,$minute,$second;
 
 :)