Scripts Logwatch - Perl - Programmation
Marsh Posté le 15-05-2006 à 12:10:12
C'est pas super dur
t'as regex elle doit matcher:
Du coup ça donne
/adresse reseau source : (192\.\d{1,3}\.\d{1,3}\.\d{1,3})/ |
Et pour le comptage, je ferais une petite hash avec comme clé l'ip trouvée:
Code :
|
edit:
En fait il serait plus logique de considérer ta regex comme ça:
ce qui fait que tu pourrais la raccourcir mais bon
Marsh Posté le 15-05-2006 à 12:21:02
Merci pour la réactivité ! ça fait plaisir
Je vais tester ta solution
Merci bcp
Marsh Posté le 15-05-2006 à 14:42:22
while (defined ($ThisLine=<STDIN> )) {
use strict;
use Data::Dumper;
my %ips;
open (F, 'messages.txt');
while (<F> ) { /adresse r esau source : (192.168.d{1,3}.d{1,3})/; {
$ips {$1}++;
}
close (F);
print Dumper %ips;
}
exit(0);
Marsh Posté le 15-05-2006 à 15:02:24
le bout de code que je t'ai donné c'etait "tout le code" à mettre dans un script perl...
et tu feras attention à bien recopier la regex, il manque les \
Marsh Posté le 15-05-2006 à 15:14:12
Voici mon Script complet :
#!/usr/bin/perl
use strict;
use Data::Dumper;
my %ips;
open (F, 'messages.txt');
while (<F> ) {
/source : (192\.\d{1,3}\.\d{1,3}\.\d{1,3})/;
$ips {$1}++;
}
close (F);
print Dumper %ips;
Marsh Posté le 15-05-2006 à 15:30:18
oui car lorsque j'éxecute Logwatch je ne reçois rien pr mon Scripts "winlog"
Marsh Posté le 15-05-2006 à 15:32:28
déjà ça compile
Tu es sur que la pattern qui récupère la ligne est correcte? Tu peux montrer une ligne ou deux de ton fichier de log stp!
Marsh Posté le 15-05-2006 à 15:41:34
euuhh c quoi la pattern ? le fichier .conf c ça ?
Voici un exemple de Log que je reçois dans /var/log/messages :
May 15 15:21:04 srv-nt10.XXX.XX security[success] 528 XXX\administrateur Ouverture de session réseau réussie : Utilisatr : administrateur Domaine : XXX Id. de la session : (0x0,0x24A09FAA) Type de session : 10 Processus de session : User32 Package d'authentification : Negotiate Station de travail : SRV-NT10 GUID d'ouv. de session : {a675ddcb-7e7e-fcfa-9bf0-3ec68c8c1627} Nom de l'utilisateur appelant : SRV-NT10$ Domaine appelant : XXX Id. de session de l'aplant : (0x0,0x3E7) ID de processus appelant : 13852 Services en transit : - Adresse réseau source : 192.168.XX.XXX Port source : 34717
Marsh Posté le 15-05-2006 à 15:47:33
marche très bien
Avec le code plus haut et le fichier texte suivant:
Adresse réseau source : 192.168.12.14 Port source : 34717 |
ça printe:
[code]$VAR1 = '192.168.12.14';
$VAR2 = 4;
$VAR3 = '192.168.12.16';
$VAR4 = 1;/[code]
Edit: t'es sur qu'il compile ton script au fait? Tu as installé le module Data::Dumper?
Marsh Posté le 15-05-2006 à 16:12:02
oui oui il compile c bon ça a l'air de marcher
nonj'ai pas installé Data::Dumper
Marsh Posté le 15-05-2006 à 16:15:47
vire les lignes:
Code :
|
et à la place de
Code :
|
mets
Code :
|
Marsh Posté le 16-05-2006 à 11:16:51
En faite mon but est de comptabiliser toutes les Authentification en Admin sur chaque serveur NT pour chaque jour.
et dans un 2eme temps de les lister par adresses IP.
Voici un exemple de Log :
May 15 15:21:04 srv-nt10.XXX.XX security[success] 528 XXX\administrateur Ouverture de session réseau réussie : Utilisatr : administrateur Domaine : XXX Id. de la session : (0x0,0x24A09FAA) Type de session : 10 Processus de session : User32 Package d'authentification : Negotiate Station de travail : SRV-NT10 GUID d'ouv. de session : {a675ddcb-7e7e-fcfa-9bf0-3ec68c8c1627} Nom de l'utilisateur appelant : SRV-NT10$ Domaine appelant : XXX Id. de session de l'aplant : (0x0,0x3E7) ID de processus appelant : 13852 Services en transit : - Adresse réseau source : 192.168.XX.XXX Port source : 34717
Voici mes 2 lignes de matching :
_if ( $ThisLine =~ m/ security.*success.*Utilisateur : administrateur/ )
{
$adminlog++; }
_while (<F> ) {
/security.*success.*Utilisateur : administrateur.*SRV-NT10.*source : (192\.\d{1,3}\.\d{1,3}\.\d{1,3})/;
$ips {$1}++;
Je pense que c'est ligne n'éffectue pas le bon matching car les rapport que je reçois sont corompue (information inéxacte, information démesurée)
Marsh Posté le 16-05-2006 à 11:33:57
rien compris
Montre nous le resultat que tu souhaiterais obtenir et ou se trouve chaque donnée sur la ligne de log...
Marsh Posté le 16-05-2006 à 11:44:29
anapajari a écrit : rien compris |
Voici un exemple de Log :
May 15 15:21:04 srv-nt10.XXX.XX security[success] 528 XXX\administrateur Ouverture de session réseau réussie : Utilisateur : administrateur Domaine : XXX Id. de la session : (0x0,0x24A09FAA) Type de session : 10 Processus de session : User32 Package d'authentification : Negotiate Station de travail : SRV-NT10 GUID d'ouv. de session : {a675ddcb-7e7e-fcfa-9bf0-3ec68c8c1627} Nom de l'utilisateur appelant : SRV-NT10$ Domaine appelant : XXX Id. de session de l'aplant : (0x0,0x3E7) ID de processus appelant : 13852 Services en transit : - Adresse réseau source : 192.168.XX.XXX Port source : 34717
Voila je voudrais que les mots en vert soit matché
Marsh Posté le 16-05-2006 à 11:49:23
D'accord MAIS QUE CE QUE TU VEUX COMME RESULTAT???
savoir combien il y a de ligne avec SVR-NT10 ou savoir combien de fois il y a l'ip 192.168.1.2 ou ...
Marsh Posté le 16-05-2006 à 11:55:33
éhéhéh ! désolé j'avais pas bien compris
Je voudrais savoir dans un 1er temps savoir combien de ligne possede les 3 premier parametre en VERT.
Et dans un 2nd temps je voudrais lister Chaque IP (avec le nombre de connexions) répondant aux 1eres conditions.
Marsh Posté le 16-05-2006 à 12:10:26
Code :
|
Et pose les questions sur ce que tu comprends pas.
Attention la regex exacte est
/security\[success\].*Utilisateur : administrateur.*Station de travail : ([^ ]+?) .*source : (192\.\d{1,3}\.\d{1,3}\.\d{1,3})/ |
Marsh Posté le 16-05-2006 à 14:47:06
Le code ne compile pas...
Je ne comprends pas ces termes :
- ([^ ]+?)
- #$res{$1} = {};
}
$res{$1}{$2}++;
$res{$1}{'TOTAL'}++;
Marsh Posté le 16-05-2006 à 15:23:31
vire la 1ere ligne:
Code :
|
c'est un copier coller depuis vim qui l'a sorti et qui doit tout faire merder.
Vire également le use Data::Dumper;
Après chez moi ça marche si c'est toujours pas le cas chez toi merci de donner l'erreur assorti
Code :
|
C'est un bout de regex qui veut dire: Tout ce qui n'est pas un espace repeté au moins un fois
Code :
|
$1 correspond au morceau matché par la 1ere parenthèse de la regex au dessus, dans ce cas le serveur
Dans ma hash resultat (%res), je regarde si il existe une clé correspondant au serveur trouvé.
Si c'est pas le cas, j'initialise la valeur de la hash res pour cette clé avec une hash anonyme.
Ensuite dans cette hash anonyme j'augmente le nombre de fois ou $2 ( qui correspond à l'ip) a été trouvé
et pareil pour total
Marsh Posté le 16-05-2006 à 15:37:11
Voici mon erreur :
Scalar found where operator expected at windows_security line 14, near ""SERVEUR $srv Nombre de connexion(s) total :" $res"
(Missing operator before $res?)
Global symbol "$res" requires explicit package name at windows_security line 6.
syntax error at windows_security line 14, near ""SERVEUR $srv Nombre de connexion(s) total :" $res"
syntax error at windows_security line 14, near "}."
Missing right curly or square bracket at windows_security line 48, at end of line
Execution of windows_security aborted due to compilation errors.
Marsh Posté le 16-05-2006 à 15:45:33
donc tu as modifié mon code
Dans ces cas là reposte le qu'on soit sur de parler de la même chose.
Néanmoins je pense que tu as oublié un point là:
Citation : Nombre de connexion(s) total :".$res |
Marsh Posté le 16-05-2006 à 15:59:02
j'ai repris ton code initial eet c bon il compile bien parcontre lors de l'execution de Logwatch, rien n'est matché pour le service.
Marsh Posté le 15-06-2006 à 15:11:41
Quelqu'un pourrait il me renseigner ?!
Voila commande suivante :
(srv-nt\d{1,2}|srv010-nt\d{1,2}).*\[error\].*(\d{1,5})
ne match pas le texte suivant :
srv010-nt13.rld.fr ntds kcc[error] 1311 AUTORITE......
Voila merci !
Marsh Posté le 15-05-2006 à 11:55:16
bonjour,
J'éssaie de configurer l'outil logwatch afin de recevoir un mail journalier relativement sinthetique.
Je récupere des logs des logs windows (dans le repoertoire /var/log de mon serveur Linux) grace à Syslog installé sur un serveur NT.
Voici le début du script d'un services logwatch :
$adminlog = 0;
while (defined ($ThisLine = <STDIN> ))
{
if ( $ThisLine =~ m/ security.*success.*Utilisateur : administrateur/ )
{
$adminlog++;
}
}
exit(0);
# Petit script qui me permet de déterminer en parsant mon fichier Log, le nombre de connexion en Administrateur qui ont était effectué)
Maintenant je voudrais apporter une amélioration pour pouvoir obtenir l'IP ainsi que le nombre de connexion de chaque IP.
Dans les Logs l'ip apparait de cette forme : "adresse reseau source : 192.xxx.xxx.xxx"
Moi ce que je voudrais c"est qu'a chaque fois qu'il rencontre la chaine de caractere "adresse reseau source :" il me retourne "192.XXX.XXX.XXX"
J'ai éssayé de me chercher (expression reguliere) mais je ne voit pas trop comment faire !
Merci