Как использовать системный журнал для вывода других (показать с whois-запросом)?

Имеется лог-файл /var/log/syslog с выводом ip-адресов, например, например. SRC=10.158.0.1.

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

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

Мои попытки неверны и выглядят так в bash-скрипте:

#/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 выглядит здесь следующим образом:

[ 116] http://paste.ubuntu.com/5859332/

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

http://paste.ubuntu.com/5862958/

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


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


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

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

7
задан 22 June 2016 в 17:32

5 ответов

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

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
0
ответ дан 22 June 2016 в 17:32

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

#/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
0
ответ дан 22 June 2016 в 17:32

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

Он состоит из цикла 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
0
ответ дан 22 June 2016 в 17:32

Для добавления опции - в случае появления «НЕДЕЙСТВИТЕЛЬНОГО СОСТОЯНИЯ» - будет ли это работать? :

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
0
ответ дан 22 June 2016 в 17:32

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

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

s/^.*SRC=\([0-9.]*\).*$/\1/ управляйте заменяет строки, которые содержат 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.]*\).*$/\1/' | xargs -n1 whois >> whois-output.txt`
5
ответ дан 22 June 2016 в 17:32

Другие вопросы по тегам:

Похожие вопросы: