Como usar o syslog para outra saída (aparece com whois - query)?

7

Existe log-file /var/log/syslog com a saída de endereços IP como por exemplo SRC=10.158.0.1 .

Eu quero verificar a partir desse arquivo cada endereço impresso em SRC= ... e, em seguida, fazer a consulta com whois (SRC= ...) .

Esta consulta deve ser monitorada.

A tentativa de mina está errada e se parece com isso em um script 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

Alguém pode ajudar com um truque? Como devo definir o endereço IP e como posso Eu uso o comando whois com este endereço IP?

A saída de / var / log / syslog parece com este snippet aqui:

link

A saída de / var / log / syslog se parece com isso - quando há um pequeno alerta (como hoje):

link

Idéia também - para executar uma consulta whois somente se houver um "estado inválido" aparecendo na linha do syslog de rolagem.

Obrigado por suas contribuições. Eu aprendi alguma coisa pelos seus códigos. Muitas vezes as soluções parecem mais fáceis do que o pensamento como aqui - porque pensei que seria mais difícil. Eu acho que com a recente contribuição da enzotib, então esta questão já está resolvida agora.

veja o novo comentário de hoje (22 de junho de 2016) referente a 16.04:

porque este script bash era para tempos de ipv4 - então o /etc/sysctl.conf precisa ser descomentado para ativar o ipv4? - então esse roteiro seria executado? caso contrário, não haverá saída whois como antes. Ter verificado isso com uncommenting line 28 e linha 33 do /etc/sysctl.conf - então este script bash neste thread funcionaria, mas entregaria muito poucos resultados porque o provedor habilitou o firewall (por causa de no-spy-act?). Desta forma, por este acréscimo de 22 de junho de 2016 este segmento é atualizado para 16,04

    
por dschinn1001 12.06.2013 / 00:10

5 respostas

8

Ainda outra solução:

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

Se você quiser apenas selecionar linhas de syslog contendo a string INVALID STATE , então o código acima pode ser modificado da seguinte forma

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
    
por enzotib 09.07.2013 / 22:15
5

Você pode usar o comando sed para extrair todo o ip dos endereços IP do arquivo e usar xargs para executar whois para cada correspondência:

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

O comando s/^.*SRC=\([0-9.]*\).*$// substitui as linhas que contêm SRC = x.x.x.x apenas pelo endereço IP.

Os comandos 't; d' ignoram linhas não correspondentes (evitando assim um comando grep separado).

O comando xargs invoca whois uma vez para cada endereço que sed produz.

Como alternativa, você pode encontrar e registrar primeiro as linhas correspondentes e extrair os endereços IP separadamente:

grep -eSRC=[0-9.]* /var/log/syslog | tee grep-output.txt | sed 's/^.*SRC=\([0-9.]*\).*$//' | xargs -n1 whois >> whois-output.txt'
    
por cscarney 09.07.2013 / 19:46
3

Talvez o código a seguir seja um ponto de partida adequado para você. Provavelmente não é a solução ideal, mas faz o seu trabalho.

Consiste em um loop for sobre todas as linhas de saída do comando dentro de $ (). Em cada iteração do loop, uma linha de saída é armazenada na variável IP. Então, no loop, o comando whois é chamado com $ IP - o conteúdo da variável IP - como argumento.

Os parênteses $ () incluem dois comandos grep - o primeiro está procurando endereços IP com SRC = escrito na frente deles e o segundo pega a saída do primeiro (via pipe |) e apenas pega o primeiro. Endereço de IP. O sinalizador -o do grep faz com que ele apenas exiba a parte correspondente das linhas em vez das linhas completas.

A expressão regular também não é muito elegante ainda. Ele está procurando por três grupos, cada um consistindo de um a três dígitos e um ponto, seguido novamente por um a três dígitos. Para manter o script legível, optei por usar expressões regulares estendidas -E. O comando "normal" do grep exigiria uma barra invertida na frente de todas as voltas e chaves ...

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
    
por soulsource 09.07.2013 / 19:47
2

Seu script deve ficar assim:

#/bin/bash

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

for ip in $(sed -e 's/SRC=//g' ~/topsecret001/pitbull001.txt)
do 
    whois $ip >> ~/topsecret001/pitbull002.txt
done
    
por Radu Rădeanu 09.07.2013 / 21:51
0

Para adicionar opção - no caso de aparecer "STATUS INVÁLIDOS" - isso funcionaria? :

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
    
por dschinn1001 10.07.2013 / 23:51