Bonjour,
je fais du perl tous les 36 du mois et je me décide à solliciter de l'aide pour 2 problèmes.
J'ai plusieurs fichiers CSV (mis 4 fichiers au format .XLS) dont le nom contient le protocole TCP ou UDP ainsi que le numéro du port. Le contenue du fichier à les adresses IP utilisant ces ports.
J'ai fait un script lisant tous les format CSV d'un répertoire:
-affiche => @IP protocole port
-affiche le nombre de fois qu'une adresse IP apparaît
-crée un fichier CSV contenant par ligne l'@IP protocole port (voir ci-dessous un bout)
10.221.166.1 TCP 135
10.235.95.97 TCP 12443
10.221.166.1 TCP 135
10.221.166.1 TCP 139
10.235.125.100 TCP 135
10.221.166.1 UDP 123
10.221.166.1 UDP 137
Je ne peux pas utiliser les modules à causes du proxy au travail.
Objectif 1
Que le fichier traite par ligne tous les ports et protocole utilisé par une adresse IP pour arriver à quelque chose comme ceci. Si on peut être fainéant et éviter d'autant des erreurs
10.221.166.1 TCP_135_139 UDP_123_137
Ca évite d'avoir autant de ligne que de port.
les underscore sont utilisé pour éviter des problèmes d'interprétation avec les virgules ou points virgules.
Objectif 2
Mettre dans la première ligne du fichier CVS pour faire des tries sans perdre une ligne
Cellule 1 => Adresse
Cellule 2 => Protocole
Cellule 3 => Port
Je suis preneur de toute idée
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62 #!/usr/bin/perl use strict; use warnings; use DateTime; my $dt = DateTime->now (time_zone=>'Europe/Paris'); my $ymd = $dt->ymd; my $hms = $dt->hms('-'); my @all = glob 'C:\Users\Alexandre\Documents\PERL_scripts\GARENCE\*.csv'; # Ces variables sont crées en dehors des boucles pour les utiliser dans et en dehors des boucles. my @ligne; my @IP; my $word; my %count; foreach my $fichier (@all) { # Récupére les chiffres du nom du fichier qui correspondant au numéro de port my @port = $fichier =~ m/\d+/g; # Récupére dans le nom du fichier le nom TCP ou UDP my @protocole = $fichier =~ m/(TCP|UDP)/ig; open my $CSV, '>>', "syntheseCSV\-$ymd\-$hms\.csv"; open my $fh, '<', $fichier; while (<$fh>) { chomp; # Fait un split sur "," et ";" et ne place que l'élément 0 dans @ligne my @ligne = (split /[,;]/)[0]; # Ne traite pas les lignes qui contiennent une lettre majuscule ou minuscule next if /[a-zA-Z]/; #Affiche les éléments qui seront inclus dans le fichiers CSV print "$ligne[0]\t @protocole\t @port \n"; #Envoie les données au fichier CSV print $CSV "$ligne[0]\,@protocole\,@port\n"; # Ajoute la valeur de @ligne à @IP push @IP, @ligne; } } print "\n"; foreach $word (@IP) { $count{$word} += 1; } # Trie par ordre décroissant des valeurs foreach $word (sort { $count{$b} <=> $count{$a} } keys %count) { print "$word\t existe $count{$word} fois\n"; }
Partager