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

Programmation et administration système Perl Discussion :

Ping sur noms machines dans fichiers txt


Sujet :

Programmation et administration système Perl

  1. #1
    Futur Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 7
    Points : 5
    Points
    5
    Par défaut Ping sur noms machines dans fichiers txt
    Coucou

    J'essaye maintenant de faire un script qui ferait un ping sur une liste de noms de machines qui sont stockés dans un fichier texte sous cette forme :

    machine1
    machine2
    machine3
    ...

    Et qui me donnera le résultat dans un autre fichier texte, voici mon code mais le syntaxe n'est apparament pas bonne merci de me dire ou j'ai faux !


    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
     
    #!/opt/perl5/bin/perl -w
     
    use strict;
     
    ## Vérification de l'existence et du type du paramètre passé au script
    $ARGV=@ARGV;
    if ($ARGV == 0) {print("\n\nPas de parametre en entree du script.\n\n",
                           "Veuillez lancer le script de cette facon:\n",
                           "  sous windows: perl -w script fichier_input\n",
                           "  sous unix:    ./script fichier_input\n\n");
                     exit;}
    if (not -f $ARGV[0]) {print("\n\nLe fichier passe en parametre n'existe pas.\n\n",
                                "Veuillez verifier que le nom du fichier est exact et ",
                                "qu'il se trouve dans le meme repertoire que le script\n\n");
                          exit;}
     
    #### Définitions des variables utilisées
    my $output_file = "ping_it_res.txt";
    my $ip;
     
    #### Ouverture du fichier de résultat
    open(RESULTAT,">$output_file") or die "Impossible de créer le fichier resultat: $!\n";
     
    ## recuperation date & heure
    my ($sec,$min,$hour,$mday,$mon,$year) = (localtime(time))[0..6];
    $mon=$mon+1; $year=$year+1900;
    foreach ($mon,$mday,$hour,$min,$sec)  { $_ ='0'.$_ if ($_ < 10) }
     
    print RESULTAT "Resultat des requêtes ping\n",
                   "Test effectué le $mday/$mon/$year à $hour:$min:$sec\n\n";
     
    #### Récupération des données dans le fichier de conf
    open(LOAD_CONF,"$ARGV[0]") or die "\nProblème lors de l'ouverture du fichier de conf $ARGV[0]: $!\n\n";
     
    while (<LOAD_CONF>) {
     
       if ( $_ !~  m/(^#|^$)/ ) {
         chomp;                  # Supprime les retours chariot
         if ( /\s$/ ) { chop; }  # Supprime le dernier espace de la ligne si present
         $ip = $_;
     
    ## vérification de la syntaxe du fichier de configuration
         if ( $ip !~ m/^ (RM|LB|CM|SD|AP|HB|SD|SF|WL|ST|SW|SR|RT|RS)|(^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$)/i ) { die "\nErreur de syntaxe: $ARGV[0] line : $.\n"; }
         my $nombre=`ping $ip -n 2 | grep -c "icmp"`;
         if ( $nombre == 0 )    { print "Le ping vers $ip N'A PAS ABOUTI\n";
                                  print RESULTAT "KO: $ip\n"; }
         elsif ( $nombre == 2 ) { print "Le ping vers $ip a abouti\n";
                                  print RESULTAT "ok: $ip\n"; }
         else { print "Problème lors du ping vers $ip\n";
                print RESULTAT "erreur: $ip - seul $nombre ping sur 2 a abouti\n"; }
     
       } # End if ^#
    } # End While
     
    close(LOAD_CONF);
    close(RESULTAT);

    Il me dit que la syntaxe de la ligne 1 du fichier que je mets en input n'est pas correct, alors qu'elle commence par RM comme selon les règles que j'ai établit !

    Merci de m'aider

  2. #2
    Membre éclairé
    Avatar de GnuVince
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2004
    Messages
    679
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2004
    Messages : 679
    Points : 803
    Points
    803
    Par défaut
    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
     
    use strict;
    use warnings;
     
    use Net::Ping;
     
    open(my $input_fichier, "<", $ARGV[0]) or die("Impossible d'ouvrir le fichier d'entrée: $!");
    open(my $output_fichier, ">", $ARGV[1]) or die("Impossible d'ouvrir le fichier de sortie: $!");
    my $p = Net::Ping->new();
     
    while (my $machine = <$input_fichier>) {
      chomp($machine);
      if ($p->ping($machine)) {
        print {$output_fichier} "$machine: ON\n";
      }
      else {
        print {$output_fichier} "$machine: OFF\n";
      }
    }
     
    close($output_fichier);
    close($input_fichier);
    $p->close();
    J'ai pas de machine pour tester ce code, mais ça devrait fonctionner. Tu pourras sans doute l'utiliser dans ton code.

  3. #3
    Futur Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Merci beaucoup !

    Pour le moment le code me dit que toutes les machines sont OFF


    RMB*****: OFF
    RMB*****: OFF
    RME*****: OFF
    Alors que non mais je vais chercher pourquoi !

    Sinon j'aimerais bien une petite explication de certaines parties du code si ca t'embête pas !

    my $p = Net:ing->new();
    Ici je comprends pas à quoi sert le ->new(); ?

    Voila j'ai plus qu'à voir pourquoi il me dit que les machines sont OFF alors qu'elles répondent à mon ping

    Merci de ton aide j'apprecie vraiment !

  4. #4
    Membre éclairé
    Avatar de GnuVince
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2004
    Messages
    679
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2004
    Messages : 679
    Points : 803
    Points
    803
    Par défaut
    Ça crée un nouvel objet qui Ping. Si tu es pas encore familier avec l'orienté objet, ça voudra sans doute rien dire, tu pourras lire le FAQ à ce sujet. Et si ça répond OFF partout, tu peux essayer de mettre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    my $p = Net::Ping->new("icmp");
    Par contre, le code devra être exécuté en root.

  5. #5
    Futur Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Voila merci beaucoup le code fonctionne :

    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
    #!/opt/perl5/bin/perl -w
     
    # ATTENTION : Ce script requiert les droits administrateurs sur la machine
     
    ####################################################
    # Pinger une liste de machine                                   
    #                                                               
    # Entrée: Liste des noms machines dans un fichier txT           
    # Sortie: Réponses positives ou négatives du ping dans un txt   
    #                                                               
    #                                         
    ####################################################
     
    ###################################################
    ####### Verification de la syntaxe du lancement du script #######
    ####################################################
     
    $ARGV=@ARGV;
    if ($ARGV == 0) {print("\n\nVeuillez entrer un fichier d'entree et de sortie\n\n");}
    if (not -f $ARGV[0]) {print("\n\nLe fichier d'entree n'existe pas\n\n");}
     
     
    use strict;
    use Net::Ping;
    use Socket;
     
     
    ####################################################
    ######## Ouverture des fichiers d'entree et de sortie ###########
    ####################################################
     
    open(my $input_fichier, "<", $ARGV[0]) or die("Impossible d'ouvrir le fichier d'entrée: $!");
    open(my $output_fichier, ">", $ARGV[1]) or die("Impossible d'ouvrir le fichier de sortie: $!");
     
    ####################################################
    ############### Definition de la variable p (ping) ##############
    ####################################################
     
    my $p = Net::Ping->new("icmp",1);
     
    ####################################################
    ###### Recuperation des donnees dans le fichier de sortie #######
    ####################################################
     
    while (my $machine = <$input_fichier>) {
    print("$machine\n");
      chomp($machine);
      if ($p->ping($machine)) {
        print {$output_fichier} "$machine: ON\n";
      }
      else {
        print {$output_fichier} "$machine: OFF\n";
      }
    }
     
    ####################################################
    ######### Fermeture des fichiers et de la requete ping  ########
    ####################################################
     
    close($output_fichier);
    close($input_fichier);
    $p->close();
    Seul problème avec ce code comme tu me l'a fait remarquer, il faut être en root pour pouvoir l'executer :/

    Je me suis donc pencher sur une autre solution :

    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
     
    #!/opt/perl5/bin/perl -w
     
    ####################################################
    # Pinger une liste de machine                                   
    #                                                               
    # Entrée: Liste des noms machines dans un fichier txt           
    # Sortie: Réponses positives ou négatives du ping dans un txt   
    #                                                               
    #                                           
    ####################################################
     
    use strict; # Oblige les variables à être declarées
     
     
    ####################################################
    ############### Définition des variables utilisées ##############
    ####################################################
     
     
    my $output_file = "ping_it_res.txt";
    my $ip;
     
    ####################################################
    ############### Création du fichier ping_it_res.txt #############
    ####################################################
     
    open(RESULTAT,">$output_file") or die "Impossible de créer le fichier resultat: $!\n";
     
     
    ####################################################
    ###### Requète ping et écriture dans le fichier résultat ########
    ####################################################
     
    open(LOAD_CONF,"$ARGV[0]") or die "\nProblème lors de l'ouverture du fichier de conf $ARGV[0]: $!\n\n";
     
    while (<LOAD_CONF>) {
     
       if ( $_ !~  m/(^#|^$)/ ) {
         chomp;                  # Supprime les retours chariot
         if ( /\s$/ ) { chop; }  # Supprime le dernier espace de la ligne si present
         $ip = $_;
         my $nombre=`ping $ip -n 2 | grep -c "icmp"`;
         if ( $nombre == 0 )    { print "Le ping vers $ip N'A PAS ABOUTI\n";
                                  print RESULTAT "$ip --- > OFF\n"; }
         elsif ( $nombre == 2 ) { print "Le ping vers $ip a abouti\n";
                                  print RESULTAT "$ip --- > ON\n"; }
         else { print "Problème lors du ping vers $ip\n";
                print RESULTAT "erreur: $ip - seul $nombre ping sur 2 a abouti\n"; }
       } # End if ^#
    } # End While
     
    ####################################################
    ##################### Fermeture du script 
    ####################################################
     
    close(LOAD_CONF);
    close(RESULTAT);
    Et la ca marche !

    Mais je me confronte à un autre problème et peut être pourra tu m'aider,

    Certaines machines ne répondent pas car elles ne sont pas dans le DNS, donc on doit pouvoir les scanner avec leurs IP mais pas leurs noms, j'ai un tableau avec leurs IP je dois donc faire à nouveau un script (ou compléter l'ancien) pour déterminer si les machines sont OFF ou si elles ne sont pas sur le DNS

    Dur dur le réseau

  6. #6
    Membre chevronné
    Avatar de Woufeil
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 1 076
    Points : 2 004
    Points
    2 004
    Par défaut
    Bonjour.

    Je pense qu'il y a plus simple que ce que tu essayes de faire
    Si tu as un fichier avec le nom de chaque machine et leur IP, pourquoi ne pas simplement faire une table de hachage qui contiendrait le couple machine => IP et pinguer directement l'IP de la machine ? Au pire, à l'affichage tu peux toujours mettre le nom de la machine et non son IP
    "En essayant continuellement, on finit par réussir. Donc : plus ça rate, plus on a de chances que ça marche" (devise Shadock)
    Application :

    ainsi qu'à regarder la avant de poser une question.

    La rubrique Perl recrute, contactez-moi.

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

Discussions similaires

  1. Renvoi chemin & nom fichier dans fichier.txt
    Par zitoune31 dans le forum VB.NET
    Réponses: 11
    Dernier message: 24/03/2011, 08h53
  2. lire données dans fichier txt
    Par flo456 dans le forum Langage
    Réponses: 5
    Dernier message: 14/09/2006, 08h01
  3. prb retour a la ligne dans fichier txt telecharge avec php
    Par supersonicblonde dans le forum Langage
    Réponses: 3
    Dernier message: 08/06/2006, 14h20
  4. Réponses: 1
    Dernier message: 05/05/2006, 10h36
  5. Donnee excel pour requete sql dans fichier txt ou doc
    Par Yogi_01 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 13/04/2006, 10h04

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