Bonjour.

Afin de tester l'état des ports en écoute des serveurs de l'entreprise où j'évolue, j'ai décidé de faire un petit script perl qui pourrait m'aider à détecter les disfonctionnements de ces serveurs.

Pour cela j'effectue un nmap classique sur les différents serveurs et le nmap me retourne une chaîne de la forme suivante :
21/tcp open ftp
22/tcp open ssh
25/tcp open smtp
80/tcp open http
etc.
Afin d'extraire les informations pour les comparer avec un tableau d'état de port par machine (port ouvert ou fermé ? Filtré ?), j'ai mis au point une expression régulière dans une boucle que voici :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
 
foreach my $key(keys %ports) {
my $temp = nmap($hosts{$key});
     (my @nmapResult) = ($temp =~ m/^(\d*\/\w*)\s*(\w*)\s*(\w*)$/mg);
     for(my $i = 0; $i < $#nmapResult; $i++) {
          print $i . ' ' . $nmapResult[$i] . "\n";
     }
}
Actuellement le résultat est le suivant :
0 21/tcp
1 open
2 ftp
3 22/tcp
4 open
5 ssh
6 25/tcp
7 open
8 smtp
9 80/tcp
10 open
11 http
Je voudrais avoir un tableau multi-dimensionnel comme pourrait me le renvoyer la fonction preg_match_all() avec le flag PREG_SET_ORDER (et j'insiste sur ce dernier point).

En somme, je voudrais avoir un nmapResult de cette forme-ci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
 
print $nmapResult[0][0]; # 21/tcp
print $nmapResult[0][1]; # open
print $nmapResult[0][2]; # ftp
print $nmapResult[1][0]; # 22/tcp
print $nmapResult[1][1]; # open
print $nmapResult[1][2]; # ssh
print $nmapResult[2][0]; # 25/tcp
etc.
Est-ce possible ? Si oui comment ?

Merci par avance pour vos réponses éventuelles.