spam-chek 0.3: Быстрее, больше, сильнее


angel2s2 аватар

angel2s2 - Posted on 31 Декабрь 2009

Я уже выкладывал и писал предыдущие версии скрипта spam-check. Сегодня же, в преддверии Нового 2010 года, хочу поделиться новой, третьей версией данного скрипта.
Напомню, скрипт предназначен для проверки своих (и не только) серверов на их наличие в черных списках (DNSBL).

В этой версии не мало новшеств. Скрипт переписан полностью с нуля и теперь работает быстрее и качественнее, а так же теперь используется sh вместо bash, как в предыдущих версиях. Теперь не нужна опция "-p" и можно указывать не только ip-адреса, но и доменные имена, правда с одной оговоркой: если доменное имя разрешается в другое доменное имя (alias), то скрипт отработает не верно. Я нарочно не стал проверять, есть ли у домена alias, т.к. считаю, что админ сам должен уметь это делать :) Т.ж. разделен поток ошибок и поток обычного вывода.

Приведу вывод "spam-check --help":

spam-check [-q] [-l] [-d dnsbl | -f filename | -i] [-s dns_server] [-t] [--] [ip or domain-name ...]
 
   -q		- Ничего не выводить
   -l		- Показать список DNSBL-серверов
   -d		- Проверить по указанному DNSBL
   -f		- Взять список DNSBL-серверов из файла (по одному на строчку)
   -i		- Сграбить список DNSBL с сайта http://myiptest.com/
   -s		- Указать DNS-сервер, через который будет идти проверка (по умолчанию OpenDNS - 208.67.222.222)
   -t		- Считать Time Out'ы ошибкой
   --		- Считается, что дальше идут только ip и/или доманные имена
   [ip or domain-name ...]	- ip и/или доменный имена, которые нужно проверить
   --vesrion, --help, --usage	- без комментариев

Немного пояснений...
Порядок опций не имеет значение. Вы можете указывать вперемешку опции, ip-адреса и доменные имена.
Опция -l может работать в сочетании с опциями -f и -l, а по умолчанию она покажет "вшитый" список из 116 DNSBL.
Вся проверка по умолчанию идет через DNS-сервер OpenDNS, что конечно чуток медленнее, но, на мой взгляд, надежнее, т.к. я не очень доверяю DNS-серверам своего провайдера. Если не хотите каждый раз указывать DNS-сервер, то можете открыть скрипт и отредактировать переменную "$DNS_SERVER", чтобы изменить DNS-сервер по умолчанию.
Опция -t выводит сообщение о том, что соединение сервера прервано по time out'у, в поток ошибок и устанавливает код завершения скрипта в 1. А по умолчанию выводы и идет на стандартный поток вывода и не считается ошибкой, т.к. код завершения будет 0, при условии, что ни одного ip-адреса нет ни в одной DNSBL.

ToDo...
В будущем планирую увеличить количество "вшитых" DNSBL.
На этом моя фантазия иссякла. Не знаю, что можно еще добавить. Если у вас есть идеи, пишите, буду добавлять по возможности.

Сам скрипт spam-check 0.3
Страница скрипта на Google Codes

По меньше спама вам и вашим серверам!
И не попадайтесь в черные списки :)
С Новым 2010 годом! До встречи в Новом году :)

5
Ваша оценка: Ничего Рейтинг: 5 (3 голоса)

Собственно было бы не плохо иметь ключ какой либо чтобы вывод скрипта имел вид

----------IP-----------
[+++SPAM+++] бла бла бла
[+++SPAM+++] бла бла бла
[+++SPAM+++] бла бла бла
----------IP-----------
[+++SPAM+++] бла бла бла
[+++SPAM+++] бла бла бла
----------IP-----------
[+++SPAM+++] бла бла бла
[+++SPAM+++] бла бла бла
[+++SPAM+++] бла бла бла

т.е. без [ok] и [error]

и еще было бы не плохо иметь ключ для выборки ip адресов для скана из файла

и картина вида scan --ip ip ip > file
не работает точнее почему то записи [+++SPAM+++] бла бла бла нету, а [ok] и [error] присутствуют

п.с. сам закоментил [ok] и [error] чтобы не мешались при выводе

ну так добавь фунционал через ключики и выложи тут или автору пришли патчик на сайт проекта.
1. например ok и error можно выводить по ключику -v (verbose)
2. -F для файла с IP для скана. хотя можно и обходится

$ cat файл | xargs spam-check --

3. +++SPAM+++ выводится в stderr, поэтому и не попадает в файл. можно пофиксить вывод, что бы было более логично

4. на сайте проекта есть версия поновее, править лучше ее

Классный скрипт.
несколько небольших проблем:
1) не во всех системах character set по умолчанию UTF-8, я получил кракозябры на экране

$ echo -ne '\e%G\e[?47h\e%G\e[?47l'

2) некорректно отрабатывается скрипт если DNSBL резолвится на 127.0.0.х

[ +++SPAM+++ ] - dnsbl-3.uceprotect.net    - (127.0.0.2)

3) Сообщение "Странно... Ты не должен был этого видеть... о_О Напиши мне багрепорт, плиз. Мое мыло: " мало информативно, не понятно что нужно делать.
4) БАГ: некорректная обработка " connection timed out "

х.х.х.х.dnsbl.jammconsulting.com has address 206.123.70.50'
++ /bin/sed -n '/connection timed out/p'
+ RES_A=
+ '[' -n '' ']'
+ _output 'Странно... Ты не должен был этого видеть... о_О Напиши мне багрепорт, плиз. Мое мыло: ' 2

1) На сколько я понимаю, это из-за того, что сам скрипт сохранен в кодировке utf-8. Я же не могу все возможные кодировки в одном файле сохранить =) Вам проще сделать так (после того, как скачаете скрипт):

$ iconv -f UTF-8 -t YOUR_CODE_PAGE -o /path/to/spam-check.recoded /path/to/spam-check
$ mv /path/to/spam-check.recoded /path/to/spam-check

А на счет "echo -ne ..." вообщем не пойму... Где вы нашли такое? У меня в скрипте только чистые echo.

2) Не, тут проблема была в другом. Я забыл переменную $2 заменить на $DNSBL =) Уже пофиксено.
Просто вначале только по TXT записи DNS серера смотрел, а потом решил смотреть по А, а ТХТ только в случае необходимости запрашивать.

3) Да, согласен. Добавил дополнительную информацию. Теперь вывод быдет таким: "Странно... Ты не должен был этого видеть... о_О Напиши мне багрепорт, плиз, укажи версии sh, sed, host и самого скрипта, а так же какая у тебя ось и какие параметры были переданы скрипту. Заранее спасибо. Мое мыло: ".

4) Не, это не "connection timed out". Я всегда думал, что DNSBL'ы висят на 127.0.0.X, вот и обламался. Тут он на 206.123.70.50 висит. Уже пофиксено.
ЗЫЖ "Висит" это образно сказано...

Если не ошибаюсь, iconv использует системную кодировку по умолчанию, если не установлена:

$ echo 'тест' | iconv -t cp1251 | iconv -f cp1251

angel2s2, держи, чутка подправил, чтоб при большом количестве ип отрабатывал в две команды:

$ host vkontakte.ru | sed -ne '/address/s/^.\+\ \([0-9\.]\+\).*$/\1/g;1p'

выдает первый хост, но каждый раз разный, не знаю, может днс такая

как предложение: logger и вызов внешнего скрипта(вот только где вызывать?), вдруг кто захочет мыло себе прислать?

и, angel2s2, как переводится слово vesrion? ;)

> Если не ошибаюсь, iconv использует системную кодировку по умолчанию
Немного ошибаешься... Он ее использует только для "выхода" (выделил жирным):

--from-code, -f encoding
  Convert characters from encoding.
 
--to-code, -t encoding
  Convert characters to encoding. If not specified the encoding corresponding to the current locale is used.

> angel2s2, держи, чутка подправил, ..........
Там ip'шники выводятся в рандомном порядке, поэтому и каждый раз ip разный, т.к. показывает только первый. Но зачем это нужно, я что-то не врубаюсь, т.е. не пойму, что ты там подправил?..
Мне нужны все ip'шники, которые "привязаны" к домену. У меня это сделано так (и работает как надо):

$ host vkontakte.ru | sed -n '/address/s/^.\+\ \([0-9\.]\+\).*$/\1/gp'

> как предложение ..................
На счет logger'а не пойму, что имелось ввиду. Чтобы в syslog умел писать чтоли?
А вызов внешнего скрипта... Зачем? Не проще ли мыло отправить, например, так, только если мы есть, хоть в одном черном списке:

spam-check -q my.server.ru || echo "My IP's in the DNSBL" | ssmtp admin@server.ru

Или так, не зависимо от результатов проверки:

spam-check my.server.ru 2>&1 | ssmtp admin@server.ru

Или даже на джаббер:

spam-check -q my.server.ru || echo "My IP's in the DNSBL" | sendxmpp admin@jabber.domain.ru

или

spam-check my.server.ru 2>&1 | sendxmpp admin@jabber.domain.ru

В этом и есть сила никсов :)) Поэтому, ИМХО, это излишне :)

> и, angel2s2, как переводится слово vesrion? ;)
Эммм... Я и сам не знаю :) АписЬкО вышло :))) Пофиксил. Спасибо.

ЗЫЖ(на всякий пожарный) Я писал у себя в блоге, как настроить эти утилитки:
ssmtp - минимальная настройка
SendXMPP: Мониторим сервер с помощью Jabber

>>> 1) не во всех системах character set по умолчанию UTF-8, я получил кракозябры на экране
>> Если не ошибаюсь, iconv использует системную кодировку по умолчанию
> Немного ошибаешься... Он ее использует только для "выхода" (выделил жирным):

а чего надо? правильно! чтоб у человека выводился текст в его кодировке без плясок (хотя там и плясок-то-плясок...) ;)

ICONV="/usr/bin/iconv"
_echo() {
  echo $@ | $ICONV -f utf8 
}
_echoe() {
  echo $@ | $ICONV -f utf8 1>&2
}

> На счет logger'а не пойму...
всякая уважающия себя софтина, тем более серверного направления, имхо, должна уметь писать логи :)
и кстати logger может не только в syslog писать.

>>>> если доменное имя разрешается в другое доменное имя (alias), то скрипт отработает не верно.
приведи пример алиаса, пжл, интересно увидать вывод >_> вообще целился сюда, но...
>... т.е. не пойму, что ты там подправил?
... ступил я тут =)

ps ссылочки: довольно кратко и информативно, то что в последнее время встречается все реже и реже. держи в том же духе.

На счет iconv теперь понял, что имелось ввиду, спасибо. Добавлю на днях.
Только вот у меня маленькое сомнение есть... А если системная кодировка не utf-8, а сам скрипт сохранен в utf-8, то будет ли скрипт вообщем работать? Вроде sh пытается прочитать файл в системной кодировке и сам ее не определяет... Или я не прав? Просто не знаю этого.

На счет logger'а теперь понял. А вначале не о том подумал, не понял, что имеется ввиду утилита logger. На днях поищу примеры работы с ней, раньше дела не имел. Поставил в ToDo.

Пример алиаса? Пожалуйста:

$ host mail.ru
mail.ru has address 217.69.128.44
mail.ru has address 217.69.128.41
mail.ru has address 217.69.128.42
mail.ru has address 217.69.128.43
mail.ru mail is handled by 10 mxs.mail.ru.

Последняя строка... Это я и имел ввиду под алиасом. Просто не знаю как правильно это назвать... :( С DNS маленький опыт.

> ps ссылочки: довольно кратко и информативно, то что в последнее время встречается все реже и реже. держи в том же духе.
Буду стараться :))

ну вот тебе эксперимент(домашняя utf8):

]$ cat << EOF > iconvtest.sh 
> #!/bin/sh
> _echo() {
>   echo \$@ | iconv -f cp1251
> }
> _echo "Эта строка написана в кодировке cp1251"
> echo "Эта строка написана в кодировке cp1251"
> EOF
]$ iconv -f utf8 -t cp1251 iconvtest.sh > iconvtest1251.sh 
]$ chmod u+x iconvtest1251.sh 
]$ ./iconvtest1251.sh  #в данный момент кодировка текста - cp1251
Эта строка написана в кодировке cp1251
��� ������ �������� � ��������� cp1251

тоже самое можно проделать и с koi8r.
По сути какая разница в какой кодировке находится файл? ведь англицкие буквы(и цифры/знаки тоже) везде(в любой кодировке) имеют одинаковые шестнадцатеричные значения, различие в этом - это уже будет скорее исключение. =) единственное, думаю, что должно быть, utf8 в локалях, ну а куда линь без утф?

зы: у логгера ман в одну страницу. ;)

альтернатива host mail.ru

]$ dig +noall +answer mail.ru
mail.ru.		1772	IN	A	217.69.128.42
mail.ru.		1772	IN	A	217.69.128.43
mail.ru.		1772	IN	A	217.69.128.44
mail.ru.		1772	IN	A	217.69.128.41
]$ dig -t mx +noall +answer mail.ru
mail.ru.		3307	IN	MX	10 mxs.mail.ru.

mxs как я это понял: Mail eXchange Server / http://ru.wikipedia.org/wiki/%D0%97%D0%B0%D0%BF%D0%B8%D1%81%D1%8C_MX

и кстати вспомнил где увидел про кодировку по умолчанию: http://linsovet.com/iconv-cyrillic-to-translit =)

На счет кодировки... Да, ты прав, спасибо :) У меня что-то вылетело из головы, что англ. симоволы во всех кодировках одинаковые :)))
А вот куда линь без утф я сам не понимаю :))) Да и во фряхе давно пора ее сделать дефолтовой (хотя может уже и сделали, давно не видел фрях и ей подобных)

Ман логгера я уже смотрел, там понятно все. Просто хочу примеров глянуть, всегда так делаю (привычка чтоли) :)

Да, MX - это Mail eXchange Server, но я встречал и не MX записи (алиасы). Если еще раз наткнусь, дам знать.

На счет dig знаю, но использовал host, т.к. первоначально была идея заставить работать этот скрипт и под виндой через нативные утилиты (без CygWin), а dig вроде бы нет (не вспомню щас), т.к. люди просили. А сам вариант очень хороший, скорее всего так и сделаю, спасибо.
На счет винды, думаю всеже через CygWin буду советовать пускать, только не люблю я его на серверах виндовых :(

Я про iconv тоже на линсовете узнал, только не помню уже в каком именно топике :)

ЗЫЖ _gaSh_, дай свой джаббер или стукнись мне на =))

Чувак, спасибо. Поставил на ежедневную проверку всех своих серверов.

Не за что :) Рад, что понравилось и оказалось полезным :)

Не забудь обновить скрипт. Пару багов пофиксил.

Кстати, можешь отслеживать обновления скрипта, например, так (через крон, есесно):

wget -q -O - http://dl.dropbox.com/u/922069/Blog/spam-check |\
 md5sum | sed 's/\-/\/path\/to\/spam-check/' | md5sum -c || echo 'SpamCheck updated!!!'

Т.ж. можешь почитать в wiki разделе - "Как узнать, что скрипт обновился"

Отправить комментарий

Google Friend Connect (leave a quick comment)
loading...
Содержание этого поля является приватным и не предназначено к показу.