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.
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
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`
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
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
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