Pull to refresh

Конвейеры командной строки

Reading time2 min
Views4.5K
Предлагаю знающим людям поделиться способами построения конвейеров командной строки (pipelines) в Unix-образных системах. Может быть, получится некоторый справочник :-)

Я начну с некоторых самых примитивных наборов, полезных для обработки журналов web-сервера.



Инвентарь


Итак, как всем известно, программа tail — выводит заданное количество строк с конца файла, кроме того, в режиме, задаваемом ключом -f, происходит отображение новых строк в файле в реальном времени.
cat — всего лишь один из способов вывода содержимого файла или нескольких файлов.
cut — позволяет выделить фрагмент строки с заданным индексом, при том, что строка разбивается на фрагменты заданным символом
sort — сортирует несколько строк в нужном порядке по нужным правилам
uniq — удаляет идущие подряд одинаковые строки, с ключём -c добавляет перед каждой строкой количество её повторений
egrep — выбор строк из файла или потока по разным логическим условиям, в том числе по регулярным выражениям
xargs — man xargs

Что можно с этим сделать


Подразумевается стандартный журнал некоторого веб-сервера access_log в стандартном формате:
10.10.0.1 — - [11/Aug/2008:02:40:15 +0400] «GET / HTTP/1.0» 403 529 «httр://referring.site.com» «Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; Hotbar 4.3.1.0)»

Чтобы посмотреть что происходит с ресурсом, есть ли запросы и какие:
tail -f access_log

Смотреть только запрашиваемые документы:
tail -f access_log | cut -d' ' -f7

Посмотреть все запрошенные уникальные документы:
cat access_log | cut -d' ' -f7 | sort | uniq

Если хочется поскорее узнать, кто сколько сделал запросов, отсортировать в порядке убывания:
cat access_log | cut -d' ' -f1 | sort | uniq -c | sort -r -d

Смешной пример из реальной практики. Есть небольшой ботнет, атакующий сайт, допускающий при этом ошибку в запрашиваемом URL. Ошибка заключается в том, что на конце URL присутствуют два слеша, а не один, например: '/rss/tag/CSS//'. При помощи небольшого набора консольных программ можно довольно тривиально заблокировать ему доступ (это далеко не самый эффективный способ, так как по одному запросу каждый бот всё же сделает). Подразумевается, что в файрволе ipfw есть таблица 1, всем адресам из которых запрещён доступ к ресурсу. Итак:
cat ./access_log | egrep 'GET [^ ]+// ' | cut -d' ' -f1 | xargs ipfw table 1 add $1
Tags:
Hubs:
+24
Comments30

Articles

Change theme settings