Script Perl - Informations [Résolu/Fermé]

Signaler
-
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
-
Bonjour à tous,

Quelqu'un aurait il l'amabilité de m'aider à commencer le programme suivant s'il vous plaît ?

Le problème étant que j'ai vraiment du mal à comprendre la syntaxe du perl.

Je connais l'utilité du programme : Il permet de lire dans un fichier log (syslog) les données sur chaque ligne et de check les access-list . Je lance mon fichier : fichier.pl > accesslist.xls et je redirige les données vers un fichier excel.

Ce qui est déjà commenté, c'est ce qui est intuitif, les autres lignes je ne comprends, j'ai vraiment besoin d'aide s'il vous plaît ...


#
$acl_name="MK1";
# Nom du fichier Syslog à examiner
$stuff="fichierSyslog.txt";
#
# Seuil : nombre de paquets minimum pour ajouter la conversation dans le rapport
$seuil=0;
$nc=0;
$conversation="";
open stuff, $stuff;
while (<stuff>) {
# On filtre le fichier d'entrée en ne traitant que les lignes comprenant la chaine de caractères entre // ci-dessous
if (/list 124/) {
s/^.*permitted//;
# print "\nLigne1 $_";
# good s/\([0-9\/]*\)//g;
# s/(\([0-9\/]*\))(.*?)(\([0-9\/]*\))/ PS\1 \2 PR\3/g;
s/ ->//g;
# print "\nLigne2 $_";
s/,//g;
s/\(0\/0\)//g;
# print "\nLigne3 $_";
s/([a-z]+).*?([\.\(\)0-9]+).*?([\.\(\)0-9]+).*?([0-9]+)/\1 \2 \3 \4/;
# print "\nLigne4 $_";
# s/(10\.22\.207)/toto/;
$conversation="$1 $2 $3";
$packet=$4;
# print "Conversation : |$conversation| $packet paquets\n";
$exist=0;
$I=0;
foreach $conv (@conv_tab) {
# print "Conv : $conv \n";
if ($conv eq $conversation) {
# print "Conv existante ($conv , $conversation )\n";
$exist=1;
$pkt_tab[$I]+=$packet;
# print " $pkt_tab[$I] \n";
last;
}
$I++;
}
if (!$exist) {
# print "Conv non existante\n";
push(@conv_tab,$conversation);
push(@pkt_tab,$packet);
# print @conv_tab;
# print "\n";
}

}
}
print "Tableau conversations \n";
$I=0;
foreach (@conv_tab) {
if ($pkt_tab[$I] > $seuil) {
print "$pkt_tab[$I] $conv_tab[$I]\n";
}
$I++;
}


pouvez vous m'aider s'il vous plait à commenter ce petit bout de code,

amicalement,

dimitri

23 réponses

lol je galere j'avance plus trop ;(
la galère
aidez moi svp
up............
j'y crois ..
aziiiiiiiiiiiiiiiiiiiiiiiii
svp aidez moi ................................
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 477
Salut,

La panique totale je vois. Et depuis 09 juin tu n'as pas avancé d'un pas?!!!

Je lance mon fichier : fichier.pl > accesslist.xls et je redirige les données vers un fichier excel.
C'est ça que tu crois.
En réalité, accesslist.xls ne sera qu'un fichier texte.
Pour écrire dans un fichier excel directement depuis Perl tu as deux possibilités (peut être qu'il y a d'autres mais je n'ai pas chercher ;-)
- un module, par exemple Spreadsheet::WriteExcel
- écrire un fichier .csv (donc utiliser entre les champs un séparateur)
je l'ouvre avec excel oui car derrière j'ai fais quelques maccros pour rechercher les valeurs qui m'intéresse tout simplement .

l'utilité du programme je la connais ... mais n'ayant aucune connaissance (linguistique) en perl, je demande de l'aide pour me commenter le coeur du programme pas ce qu'il fait .

merci bcp !!
peux tu m'aider ?
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 477
Re,

Voici une partie, mes commentaires sont en gras

# ouverture de handle de fichier stuff
# on utilise en général les majuscules
# pour faire la différence entre une variable et un handle
# ça donne
# on utilise aussi un test d'ouverture de handle
# open STUF, $stuff or die "E/S $stuff : $!\n";

open stuff, $stuff;

# ici on commence la lecture de handle
# le handle c'est la connexion entre le programme et le fichier
# la lecture se fait ligne par ligne

while (<stuff>) {
# On filtre le fichier d'entrée en ne traitant que les lignes comprenant la chaine de caractères entre // ci-dessous
        if (/list 124/) {
                s/^.*permitted//;
# print "\nLigne1 $_";
# good s/\([0-9\/]*\)//g;
# s/(\([0-9\/]*\))(.*?)(\([0-9\/]*\))/ PS\1 \2 PR\3/g;
                s/ ->//g; # ici on supprime tout espace suivi d'un tiret suivi d'n signe plus grand
                          # et ça sur tout la ligne
                          # traitement effectuer sur chaque ligne
# print "\nLigne2 $_";
  s/,//g;  # on supprime tous les virgules
  s/\(0\/0\)//g; # on supprime toute sous chaîne
                 # ( suivi de 0 suivi de / suivi de 0 suivi de )
                 # ce qui donne (0/0)
# print "\nLigne3 $_";
  s/([a-z]+).*?([\.\(\)0-9]+).*?([\.\(\)0-9]+).*?([0-9]+)/\1 \2 \3 \4/;
  # la partie regex
  #=========================================================================
  # [a-z] - clase de caractères qui peut reconnaître un caractère de a à z
  # + - quantificateur qui veut dire une fois ou n'importe combien de fois
  # . - n'importe quel caractère
  # *? - quantificateur paresseux, qui veut dire 0 fois, une fois, ou tant
  # que tu peux jusqu'à 1ère caractère suivant le motif
  #
  # exemple pour comprendre
  #------------------------------------
  # $ echo je ne sais pas si tu sais le langage perl | perl -ne '/(.*sais)/;print "$1\n"'
  # je ne sais pas si tu sais
  # $ echo je ne sais pas si tu sais le langage perl | perl -ne '/(.*?sais)/;print "$1\n"'
  # je ne sais
  # -----------------------------------
  # fin exemple
  # [\.\(\)0-9]
  # classe de caractère qui peut reconnaître un point, une paranthèse ouvrante ou fermante
  # le chiffre de 0 à 9
  # + on l'a déjà vu
  # .*? on l'a déjà vu
  # [0-9] - classe de caractères qui reconnaît un chiffre de 0 à 9
  # =========================================================================
  # la partie remplacement
  # -----------------------------------------
  # les paranthèses dans les regex ont le rôle de capturer
  # leur numérotation se fait en commençant de la partie gauche
  # et c'est la paranthèse ouvrante qui est comptée
  # \1 c'est la capture numéro 1
  # \2 c'est la capture numéro 2
  # etc.
  #
  # Exemple
  #
  # $ perl -e '$var="123 azerty (100)";$var=~s/([0-9]+)\s*([a-z]+)\s*(\([0-9]+\))/\3 \2 \1/;print "$var\n";'
  # (100) azerty 123
  # mais je préfère $1, $2 et $3
  # $ perl -e '$var="123 azerty (100)";$var=~s/([0-9]+)\s*([a-z]+)\s*(\([0-9]+\))/$3 $2 $1/;print "$var\n";'
  # (100) azerty 123
merci beaucoup c'est gentil !!!
way
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 477
Hi,

I don't speak english. Be patient. I'm at work.

La suite ce soir.
J'ai vu qu'il manque des choses dans ton programme
Par exemple je vois
foreach $conv (@conv_tab) { 
mais je ne vois pas où le tableau @conf_tab est rempli.
Ok, thanks you :)

it's really sympathic