Консультация по IF (сравнение данных)

Программирование на sh, быть может немного про альтернативные языки
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
24rus
мл. сержант
Сообщения: 75
Зарегистрирован: 2008-09-27 16:04:59
Откуда: Красноярск
Контактная информация:

Консультация по IF (сравнение данных)

Непрочитанное сообщение 24rus » 2013-12-13 6:32:49

Hi, All :)

Вопрос: как правильно сделать сравнение в скрипте?
сабж: Есть скрипт вытаскивающий из логов, "плохие" ip-адреса, и добавляющий их, в таблицу BRUTE (для PF), хочется сделать сравнение, найденных IP-адресов с существующими в таблице, что-бы добавлять только новые адреса, как это сделать через if ?

Код: Выделить всё

for STR in `cat ${SPAM}`; do
     if [ ??? ]; then     
   Как лучше сделать сравнение, вывести существующие ip-адреса в отдельный файл и сравнить с ним, или можно сравнить напрямую с  данными полученными из таблицы  (/sbin/pfctl -t BRUTE -T show ) ? 
     fi
done
Сам скрипт.

Код: Выделить всё

#!/bin/sh
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
echo -------------------------------------------------------------------
echo Start
cd /
cd /var/log
LOG="/var/log/maillog"
LOG2="/var/log/all.log"
SPAM="/var/log/SPAM.log"
SPAM_T="/var/log/SPAM_T.log"
    grep "warning" ${LOG2} | egrep -o '([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}' | sort -u >> ${SPAM_T}
    grep "warning" ${LOG} | egrep -o '([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}' | sort -u >> ${SPAM_T}
    grep "RCPT from unknown" ${LOG} | egrep -o '([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}' | sort -u >> ${SPAM_T}
sleep 1
    sort -u ${SPAM_T} > ${SPAM}
    rm -rf ${SPAM_T}
sleep 3
for STR in `cat ${SPAM}`; do
    echo $STR "add to BRUTE"
    /sbin/pfctl -t BRUTE -T add $STR
done
sleep 3
    echo "#------------------------------------------" >> ${SPAM}
    /bin/echo -n "# `/bin/date` !!!" >> ${SPAM}
    echo "" >> ${SPAM}
    /sbin/pfctl -t BRUTE -T show >> ${SPAM}
    echo "#------------------------------------------" >> ${SPAM}
    cat ${SPAM} | mail -s "BRUTE"  (почтовый@ящик)
echo Finish !
p.s. начинающий скрипто-писатель :D
Show must go on !

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

lazhu
сержант
Сообщения: 252
Зарегистрирован: 2013-08-10 14:28:38
Контактная информация:

Re: Консультация по IF (сравнение данных)

Непрочитанное сообщение lazhu » 2013-12-13 7:05:17

Самое простое:

Код: Выделить всё

pfctl -t BRUTE -T show > file
cat ${SPAM} >> file
sort -u
pfctl -t BRUTE -T flush
и добавляете весь файл в пустую таблицу.

Также можно протестировать адреса в ${SPAM} на совпадения с адресами в таблице:

Код: Выделить всё

pfctl -t BRUTE -T test -f ${SPAM}
Строки с совпадающими адресами будут начинаться буквой "M"

Аватара пользователя
24rus
мл. сержант
Сообщения: 75
Зарегистрирован: 2008-09-27 16:04:59
Откуда: Красноярск
Контактная информация:

Re: Консультация по IF (сравнение данных)

Непрочитанное сообщение 24rus » 2013-12-13 7:30:16

to lazhu

Такой вариант не подходит, т.к. в кроне есть строка , убирающая из таблицы BRUTE записи IP-адресов сделанные более 24 часов назад, а в таблицу BRUTE еще добавляются IP адреса, из самого PF.
Show must go on !

Аватара пользователя
24rus
мл. сержант
Сообщения: 75
Зарегистрирован: 2008-09-27 16:04:59
Откуда: Красноярск
Контактная информация:

Re: Консультация по IF (сравнение данных)

Непрочитанное сообщение 24rus » 2013-12-13 12:14:35

Хм, пока выбирал if или case в манах на greb, наткнулся на сравнение :)

В итоге получил скрипт:

Код: Выделить всё

#!/bin/sh
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
echo -------------------------------------------------------------------
echo Start
cd /
cd /var/log
LOG="/var/log/maillog"
LOG2="/var/log/all.log"
SPAM="/var/log/SPAM.log"
SPAM_T="/var/log/SPAM_T.log"
SPAM_B="/var/log/SPAM_B.log"
    grep "warning" ${LOG2} | egrep -o '([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}' | sort -u >> ${SPAM_T}
    grep "warning" ${LOG} | egrep -o '([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}' | sort -u >> ${SPAM_T}
    grep "RCPT from unknown" ${LOG} | egrep -o '([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}' | sort -u >> ${SPAM_T}
sleep 1
    sort -u ${SPAM_T} > ${SPAM}
    rm -rf ${SPAM_T}
    /sbin/pfctl -t BRUTE -T show >> ${SPAM_T}
    sed 's/^[ \t]*//' ${SPAM_T} > ${SPAM_B}
    rm -rf ${SPAM_T}
    grep -v -f ${SPAM_B} ${SPAM} > ${SPAM_T}  #Сравниваем данные из таблицы BRUTE и с грабленных логов 
    rm -rf ${SPAM_B}
    rm -rf ${SPAM}
sleep 1
for STR in `cat ${SPAM_T}`; do
    echo $STR "add to BRUTE" >> ${SPAM}
    /sbin/pfctl -t BRUTE -T add $STR
done
sleep 1
    rm -rf ${SPAM_T}
    echo "#------------------------------------------" >> ${SPAM}
    /bin/echo -n "# `/bin/date` !!!" >> ${SPAM}
    echo "" >> ${SPAM}
    /sbin/pfctl -t BRUTE -T show >> ${SPAM}
    echo "#------------------------------------------" >> ${SPAM}
echo Finish !
Теперь возник вопрос, а можно ли сохранять результат grep , не в файл, а в памяти, что-бы исключить запись/перезапись/удаление файлов ?
Show must go on !

lazhu
сержант
Сообщения: 252
Зарегистрирован: 2013-08-10 14:28:38
Контактная информация:

Re: Консультация по IF (сравнение данных)

Непрочитанное сообщение lazhu » 2013-12-13 12:54:29

Как-то чересчур навороченно. Зачем вообще делать проверки? Насколько я помню, pf игнорирует дубликаты.
Сохранить в памяти можно все, что угодно, записав это в переменную.

kpp
лейтенант
Сообщения: 613
Зарегистрирован: 2009-08-05 16:10:46
Откуда: Украина Днепропетровск-Киев
Контактная информация:

Re: Консультация по IF (сравнение данных)

Непрочитанное сообщение kpp » 2013-12-13 20:25:57

На сколько я понял, вам нужно отобрать из одного списка те ИП, которых нет во втором?

Код: Выделить всё

cat ФАЙЛ_ВТОРОГО_СПИСКА | grep -v -f - ФАЙЛ_ПЕРВОГО_СПИСКА

Код: Выделить всё

cat ФАЙЛ_ВТОРОГО_СПИСКА
можно заменить на скрипт получения этого списка.
Нет, ребята, я не гордый. Не загадывая вдаль, так скажу: зачем мне орден? Я согласен на медаль.