Вместо того, чтобы управлять длинным списком ботов, вы можете отфильтровать ботов на основе нескольких ключевых слов, присутствующих в строке -агента пользователя, и пропустить только определенных ботов.
Я использую это, чтобы заблокировать всех пауков/ботов, которые я не хочу сканировать на моем сайте. Затем из них я пропускаю только тех, кто заинтересован в индексации веб-сайта. Все остальные блокируются брандмауэром.
Пока это работает достаточно хорошо для меня.
sudo nohup tail -f /var/log/apache2/access.log | awk -F' - |\"' 'tolower($7) ~ /bot|crawler|spider/ && tolower($7) !~ /google|yahoo|bing|msn|ask|aol|duckduckgo/{system(" sudo ufw deny from "$1" to any comment \""$7"\"")}' > /dev/null &
Несколько grep
реализаций имеют опцию -P
, которая позволяет вам использовать Perl -как регулярное выражение и, в частности, perl
оператор отрицательного просмотра вперед (?!...)
.
Таким образом, для поиска screenshot
вхождений, которые не найдены после //
, вы можете сделать:
grep -P '^(?:(?!//).)*screenshot'
В стандартных базовых регулярных выражениях нет \s
. POSIX требует, чтобы [\s]
внутри выражений в квадратных скобках соответствовало либо \
, либо s
. Снаружи поведение не определено, что позволило некоторым grep
реализациям, таким как последние версии GNU grep
, придать ему значение, аналогичное тому, что оно имеет вperl
(эквиваленте стандарта[[:space:]]
).
Здесь вы также можете использовать реальную вещь и сделать:
perl -ne 'print if s|//.*||r =~ /screenshot/'
Для полноты картины ast -открытая реализация grep
имеет параметр -X
для расширенных регулярных выражений. И эти регулярные выражения имеют !
оператор отрицания. Итак, вы также можете:
grep -X '^(.*//.*)!screenshot'
С помощью sed
вы также можете удалить комментарии после того, как сделаете копию пространства шаблонов в пространство хранения, прежде чем проверять наличиеscreenshot
:
sed 'h;s|//.*||;/screenshot/!d;g'
Сawk
:
awk -F // 'index($1, "screenshot")'
(index()
для проверки подстроки используйте $1 ~ /screenshot/
для (расширенного )сопоставления регулярных выражений ).
Если разделитель полей установлен на //
, $1
является частью перед //
.