IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

Regexp et équivalent perl de la fonction preg_match_all.


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 2
    Par défaut Regexp et équivalent perl de la fonction preg_match_all.
    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.

  2. #2
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    Un tour sur le CPAN.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 2
    Par défaut
    Effectivement, pourquoi essayer de réinventer la roue lorsque le parseur existe déjà.

    Encore faut-il être l'administrateur système pour installer les modules perl. (Mais c'est mon cas alors je passe le sujet en résolu.)

    Cela dit et pour ma culture personnelle, il n'y a aucun moyen simple de trouver un équivalent du comportement de cette fonction php ? En admettant que ce ne soit pas une chaîne renvoyée par nmap bien entendu.

    Merci encore, je me plongerai dans la documentation lundi. Il est 20 heures 20, il est grand temps que je quitte le boulot. :þ

    Bonne fin de soirée.

  4. #4
    Membre chevronné
    Avatar de Schmorgluck
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    371
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2006
    Messages : 371
    Par défaut
    Quelques remarques :

    Ton script, appliqué aux données que du donnes en exemple, ne peut pas donner tous les résultats. En effet, la variable $#nmapResult contient la valeur du dernier indice du tableau @nmapResult. Or, dans ton for, tu utilises l'opérateur < pour ton test. Donc le dernier élément du tableau ne sera jamais traité par la boucle for, puisque le dernier indice est exclu. C'est une erreur classique quand on débute. il vaut mieux ne pas utiliser $#nmapResult pour ça, et opter plutôt pour @nmapResult : en contexte scalaire, cela renvoit tout simplement la taille du tableau (voir la perldoc perldata sur les contextes).

    Pour ce qui est du résultat que tu souhaites, il est effectivement possible de l'obtenir sans recourir aux modules, mais c'est un peu tordu.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    foreach my $key(keys %ports) {
        my $temp = nmap($hosts{$key});
        my @nmapLines = ($temp =~ m{\d+/\w+\s+\w+\s+\w+}g);
        my @nmapResult;
        push @nmapResult, [m{^(\d+/\w+)\s+(\w+)\s+(\w+)}] foreach @nmapLines;
        for(my $i = 0; $i < @nmapResult; $i++) {
            printf "$i %6s %6s %s\n", @{$nmapResult[$i]};
        }
    }
    Cet exemple utilise notamment des références, qui sont le seul moyen de construire des tableaux à deux dimensions ou plus en Perl. Voir à ce sujet la perldoc perlref ou la FAQ.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [RegEx] Utilisation de la fonction "preg_match_all" avec des apostrophe ou des œ
    Par arnaudperfect dans le forum Langage
    Réponses: 4
    Dernier message: 16/08/2008, 23h05
  2. Réponses: 15
    Dernier message: 14/03/2008, 09h52
  3. [RegEx] problème fonction preg_match_all()
    Par alejandro dans le forum Langage
    Réponses: 6
    Dernier message: 22/06/2007, 18h26
  4. perl et les fonctions
    Par Olivier Regnier dans le forum Langage
    Réponses: 2
    Dernier message: 07/04/2007, 22h04
  5. [Perl] Appeler une fonction d'un webservice
    Par LE NEINDRE dans le forum Web
    Réponses: 2
    Dernier message: 03/05/2006, 09h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo