web-dev-qa-db-fra.com

Comment utiliser syslog pour une sortie else (afficher avec whois - query)?

Il y a le fichier journal /var/log/syslog avec le résultat des adresses IP comme par exemple. SRC=10.158.0.1.

Je veux numériser à partir de ce fichier chaque adresse imprimée dans SRC= ... puis faire une requête avec whois (SRC= ...).

Cette requête doit être surveillée.

La mienne tentative est fausse et ressemble à ceci dans un 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

Quelqu'un peut-il aider avec un tour? Comment définir l'adresse IP et comment utiliser la commande whois avec cette adresse IP?

La sortie de/var/log/syslog ressemble à cet extrait:

http://paste.ubuntu.com/5859332/

La sortie de/var/log/syslog ressemble à ceci - quand il y a une petite alerte (comme aujourd'hui):

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

Idea serait trop - effectuer une requête whois uniquement s'il y a un "état invalide" qui apparaît dans la ligne du syslog défilant.


Merci pour vos contributions. J'ai appris quelque chose par vos codes. Souvent, les solutions semblent plus faciles qu'on ne le pense ici - car je pensais que ce serait plus difficile. Je pense qu'avec la récente contribution de enzotib, cette question est déjà résolue.


voir le nouveau commentaire d'aujourd'hui (22 juin 2016) faisant référence au 16.04:

parce que ce script bash était pour l'époque de ipv4 - ne faut-il pas commenter /etc/sysctl.conf pour activer ipv4? - alors ce script serait exécuté? sinon, il n'y a plus de sortie whois comme avant. Avoir vérifié cela avec les lignes 28 et 33 non commentées de /etc/sysctl.conf - alors ce script bash dans ce fil fonctionnerait, mais fournirait très peu de sortie parce que le fournisseur a activé le pare-feu (à cause de no-spy-act?). De cette façon, par cette addition du 22 juin 2016, ce fil est actualisé pour le 16.04.

7
dschinn1001

Encore une autre solution:

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

Si vous souhaitez uniquement sélectionner les lignes de syslog contenant la chaîne INVALID STATE, le code ci-dessus peut être modifié comme suit:

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
8
enzotib

Vous pouvez utiliser une commande sed pour extraire toutes les adresses IP du fichier, puis utiliser xargs pour exécuter whois pour chaque correspondance:

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

La commande s/^.*SRC=\([0-9.]*\).*$/\1/ remplace les lignes contenant SRC = x.x.x.x avec uniquement l'adresse IP.

Les commandes 't; d' ignorent les lignes ne correspondant pas (évitant ainsi une commande séparée grep).

La commande xargs appelle whois une fois pour chaque adresse générée par sed.


Vous pouvez également rechercher et consigner d’abord les lignes correspondantes, puis extraire les adresses ip séparément:

grep -eSRC=[0-9.]* /var/log/syslog | tee grep-output.txt | sed 's/^.*SRC=\([0-9.]*\).*$/\1/' | xargs -n1 whois >> whois-output.txt`
5
cscarney

Peut-être que le code suivant est un bon point de départ pour vous. Ce n'est probablement pas la solution optimale, mais cela fait son travail.

Il consiste en une boucle for sur toutes les lignes de sortie de la commande dans $ (). À chaque itération de la boucle, une ligne de sortie est stockée dans la variable IP. Ensuite, dans la boucle, la commande whois est appelée avec $ IP - le contenu de la variable IP - en argument.

Les crochets $ () encadrent deux commandes grep - la première recherche les adresses IP avec SRC = écrites devant elles et la seconde prend la sortie de la première (via un tube |) et ne prend que l’adresse IP. L'option -o de grep lui permet de ne produire que la partie correspondante des lignes au lieu des lignes complètes.

L'expression régulière n'est pas encore très élégante. Il recherche trois groupes, chacun composé de un à trois chiffres et d'un point, suivis de nouveau par un à trois chiffres. Pour que le script reste lisible, j'ai choisi d'utiliser les expressions régulières étendues -E. La commande grep "normale" nécessiterait une barre oblique inverse devant chaque tour et accolade ...

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
3
soulsource

Votre script devrait ressembler à ceci:

#/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
2
Radu Rădeanu

Car pour ajouter une option - en cas d'afficher "INVALID STATE" - cela fonctionnerait alors? :

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
dschinn1001