Как использовать вывод syslog for else (показать с whois-query)?

7

Существует log-файл /var/log/syslog с выходом ip-адресов например, например. SRC=10.158.0.1 .

Я хочу отсканировать из этого файла каждый напечатанный адрес в SRC= ... , а затем сделать запрос с whois (SRC= ...) .

Этот запрос должен контролироваться.

Ошибка Mine ошибочна и выглядит так: bash-script:

#/bin/bash

while [ 1 ]
do
    grep ‘SRC=ip-address’ /var/log/syslog >> /home/$user/topsecret001/pitbull001.txt;
    whois ‘SRC=ip-address’ >> /home/$user/topsecret001/pitbull002.txt;
done

Может кто-нибудь помочь с трюком? Как определить ip-адрес и как Я использую команду whois с этим ip-адресом?

Результат работы / var / log / syslog выглядит следующим образом:

Ссылка

Результат работы / var / log / syslog выглядит так: когда есть небольшое предупреждение (например, сегодня):

Ссылка

Идея была бы слишком - выполнить whois-запрос, только если в строке прокручиваемого syslog появляется «недопустимое состояние».

Спасибо за ваши вклады. Я кое-что узнал по вашим кодам. Часто решения выглядят легче, чем мысли, как здесь, потому что я думал, что это будет больше затруднений. Я думаю, что с недавним вкладом энзотиба этот вопрос решается уже сейчас.

см. новый комментарий сегодняшнего дня (22 июня 2016 года), ссылаясь на 16.04:

, потому что этот bash-скрипт был во времена ipv4 - значит, для включения ipv4 нужно отключить /etc/sysctl.conf? - тогда этот скрипт запустится? в противном случае нет whois-output, как раньше. Вы проверили это с помощью строки uncommenting 28 и строки 33 в файле /etc/sysctl.conf - тогда этот bash-скрипт в этом потоке будет работать, но будет поставляться очень мало, потому что провайдер включил брандмауэр (из-за отсутствия-шпиона-действия?). Таким образом, этим дополнением от 22 июня 2016 года эта тема актуализируется для 16.04

    
задан dschinn1001 11.06.2013 в 22:10
источник

5 ответов

8

Еще одно решение:

awk '{ 
      for (i = 1; i <= NF; i++) 
        if ($i ~ /^SRC=/) 
          print substr($i, 5) 
    }' /var/log/syslog |
  sort -u |
  while read ip; do
    printf ' === %s ===\n' "$ip"
    whois "$ip"
  done

Если вы хотите только выбрать строки syslog , содержащие строку INVALID STATE , то указанный выше код можно изменить следующим образом

awk '/INVALID STATE/ { 
      for (i = 1; i <= NF; i++) 
        if ($i ~ /^SRC=/) 
          print substr($i, 5) 
    }' /var/log/syslog |
  sort -u |
  while read ip; do
    printf ' === %s ===\n' "$ip"
    whois "$ip"
  done
    
ответ дан enzotib 09.07.2013 в 20:15
источник
5

Вы можете использовать команду sed для извлечения всех IP-адресов из IP-адреса, затем используйте xargs для запуска whois для каждого соответствия:

sed 's/^.*SRC=\([0-9.]*\).*$//;t;d' < /var/log/syslog | xargs -n1 whois >> output.txt

Команда s/^.*SRC=\([0-9.]*\).*$// заменяет строки, содержащие SRC = x.x.x.x, только с IP-адресом.

Команды 't; d' пропускают несогласованные строки (тем самым избегая отдельной команды grep ).

Команда xargs вызывает whois один раз для каждого адреса, который выдает sed .

В качестве альтернативы вы можете сначала найти и записать соответствующие строки, а затем извлечь IP-адреса отдельно:

grep -eSRC=[0-9.]* /var/log/syslog | tee grep-output.txt | sed 's/^.*SRC=\([0-9.]*\).*$//' | xargs -n1 whois >> whois-output.txt'
    
ответ дан cscarney 09.07.2013 в 17:46
источник
3

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

Он состоит из цикла for по всем строкам вывода команды в $ (). В каждой итерации цикла одна строка вывода сохраняется в переменной IP. Затем в цикле команда whois вызывается с $ IP - содержимым переменной IP - в качестве аргумента.

Скобки $ () заключают две команды grep - первая ищет IP-адреса с SRC =, написанные перед ними, а вторая берет вывод первого (через канал |) и просто берет Айпи адрес. Флаг -o grep заставляет его выводить только согласованную часть строк, а не полные строки.

Регулярное выражение также не очень элегантно. Он ищет три группы, каждая из которых состоит из одной-трех цифр и точки, за которой следуют от одной до трех цифр. Чтобы прочитать сценарий, я решил использовать расширенные регулярные выражения -E. «Нормальная» команда grep потребует обратную косую черту перед каждым раундом и фигурной скобкой ...

for IP in \
 $(grep  -E "SRC=([0-9]{1,3}\.){3}[[0-9]{1,3}" -o  /var/log/syslog  | \
 grep -E "([0-9]{1,3}\.){3}[[0-9]{1,3}" -o);
    do whois $IP;
done
    
ответ дан soulsource 09.07.2013 в 17:47
источник
2

Ваш скрипт должен выглядеть следующим образом:

#/bin/bash

grep 'SRC=' /var/log/syslog | awk 'BEGIN {FS="[ \t]+|\|"} {print $13}' | uniq >> ~/topsecret001/pitbull001.txt

for ip in $(sed -e 's/SRC=//g' ~/topsecret001/pitbull001.txt)
do 
    whois $ip >> ~/topsecret001/pitbull002.txt
done
    
ответ дан Radu Rădeanu 09.07.2013 в 19:51
источник
0

Для добавления опции - в случае появления «INVALID STATE» - будет ли это работать?

awk '{

    for (i = 1; i <= NF; i++)

      if ($i ~ /^SRC=/)

         print substr($i, 5)

   }' /var/log/syslog | sort -u | while read ip; 

do

   printf ' INVALID STATE ' && printf ' === %s ===\n' "$ip"

   whois "$ip"

 done
    
ответ дан dschinn1001 10.07.2013 в 21:51
источник

Ознакомьтесь с другими вопросами по меткам