Страница 1 из 1

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

Добавлено: 2013-12-13 6:32:49
24rus
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

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

Добавлено: 2013-12-13 7:05:17
lazhu
Самое простое:

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

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"

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

Добавлено: 2013-12-13 7:30:16
24rus
to lazhu

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

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

Добавлено: 2013-12-13 12:14:35
24rus
Хм, пока выбирал 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 , не в файл, а в памяти, что-бы исключить запись/перезапись/удаление файлов ?

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

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

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

Добавлено: 2013-12-13 20:25:57
kpp
На сколько я понял, вам нужно отобрать из одного списка те ИП, которых нет во втором?

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

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

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

cat ФАЙЛ_ВТОРОГО_СПИСКА
можно заменить на скрипт получения этого списка.