Здесь, наверное, опечатка.
Нужно заменить grep "GET /" на grep "GET / ", а то под это условие попадет не только корень сайта.
Я немножко дописал. Получилось что-то типа такого
#!/bin/sh logname=/home/site/logs/access.log linesave=.linenumber line1=$(cat $logname |wc -l) if [ -f $linesave ]; then line0=$(cat $linesave) offset=$((line1-line0)) else offset=$line1 fi if [ $line1 -ne $line0 ]; then echo $line1 >$linesave tail -n $offset $logname | grep "GET / " | awk '{print $1}' | sort | uniq -c | sort -n | awk '{if ($1>100) print "ipfw add deny tcp from "$2" to me"}' | sh fi
Основное изменение - просмотр только части access.log с последнего запуска. Таким образом, если запускать этот скрипт каждую минуту, то будут блокироваться IP обратившиеся к главной странице 100 раз ({if ($1>100)) в течении минуты. Механизм блокировки основан на командах Himiko.
Пояснения к коду.
Обрабатываемый лог указывается в переменной logname. В коде это /home/site/logs/access.log. Файл .linenumber используется для сохранения номера последней строки со времени последнего запуска. Если используется ротация логов, то .linenumber нужно удалять.
Так эта фишка программы :).
А если серьезно, то при генерации и в Windows XP такое происходит.
innix, хочу предложить такое решение (временное) с помощью iptables.
iptables -A INPUT -p tcp --dport 80 -m string --string 'GET / ' --algo bm --from 40 --to 46 -m connlimit --connlimit-above 4 -j DROP
Не более 4 одновременных запросов к главной странице с одного IP. На остальные страницы ограничение не действует.
Это реализация в Linux :(, наверное такое же можно сделать и в FreeBSD 6.1
neov, IMHO если в свап (swap) ничего не пишется, то на размер памяти (по top) можно не обращать внимание.
VirtualPC не самый лучший выбор, по крайней мере, 2007 (6.0.156.0). Не поддерживает загрузку по сети, как описано в статье Установка Windows XP по сети. RIS, но не Microsoft. А это для меня было важно.
На мой взгляд, безопасней выдавать одно содержание Питеру, а другое Москве с использованием JavaScript. При этом для поисковиков страница будет одинаковой.
if $var=x then x;
Согласен E_NOTICE не ошибки синтаксиса. Ошибки это E_PARSE.
Ваш код при E_STRICT у меня выдает пустой экран. При Е_ALL Parse error: syntax error, unexpected T_VARIABLE, expecting '(' in /home/www/2.php on line 2. Такая же ошибка и при E_ALL & ~E_NOTICE
Версия PHP Version 5.2.6
neolord,
error_reporting=E_ALL ^ E_NOTICE
заменить на error_reporting=E_ALL или на error_reporting = E_ALL & ~E_NOTICE
neolord, php.ini
error_reporting = E_ALLdisplay_errors = On
Dreammaker, можешь паказать, кто ворует?