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

Réseau/Web Python Discussion :

Ping sous Python


Sujet :

Réseau/Web Python

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Décembre 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Ping sous Python
    Bonjour à tous.

    Alors voilà mon problème. J'aimerai faire un ping de mes machines que j'ai inscrite dans une liste mais j'aimerai faire une fonction ping pour l'utiliser. Pourriez-vous m'aider s'il vous plait? merci
    Voilà le début de mon programme
    Fichiers attachés Fichiers attachés

  2. #2
    Expert éminent

    Avatar de deusyss
    Homme Profil pro
    Expert Python
    Inscrit en
    Mars 2010
    Messages
    1 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Expert Python
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 659
    Points : 8 442
    Points
    8 442
    Par défaut
    Bonjour,

    Je viens de lire ton code. Je me permets avant tout, quelques propositions d'amelioration pour ton code:

    -Utiliser raw_input à la place d'input (si Python 2.X)
    -range(1,7) ) la place de range(1)
    -Utiliser un encodage en debut de code

    Voilà. Concernant ta fonction/procedure ping, je te conseillerai de regarder du cote de subprocess, avec la methode call. Elle te permettra d'executer des commandes de terminal, d'attendre la reponse, puis de l'analyser
    "La connaissance appartient à tout le monde" (Film Antitrust)

    Tout le nécessaire pour Python:
    *News/Accueil *Cours/tutoriels *FAQ
    *Forums *Outils dédiés *Mon espace personnel avec mes Articles, Cours et Tutoriels

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Décembre 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Merci d'avoir répondu

    J'utilise python 3.3 et pour le range j'ai voulu faire un test pour l'instant avec une seule condition.

    Mais ce que je voudrais faire c'est en mettant le nom des machines que Python me dise les machines répondent ... ou pas.

    Exemple :
    Nom machine 1 : www.google.fr
    Cette machine répond correctement

    Nom machine 2 : sdgergfhfhgdsfezdg
    Cette machine ne répond pas correctement

    Vois tu ce que je veux dire??

  4. #4
    Expert éminent

    Avatar de deusyss
    Homme Profil pro
    Expert Python
    Inscrit en
    Mars 2010
    Messages
    1 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Expert Python
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 659
    Points : 8 442
    Points
    8 442
    Par défaut
    Oui, je voit parfaitement.

    Il faut utiliser le subprocess.call, donc la doc officielle est ici. OU sinon os.popen.

    Cela te permettra d'exécuter la commande, puis de lire le retour, et d'en déduire le message que tu doit afficher.
    "La connaissance appartient à tout le monde" (Film Antitrust)

    Tout le nécessaire pour Python:
    *News/Accueil *Cours/tutoriels *FAQ
    *Forums *Outils dédiés *Mon espace personnel avec mes Articles, Cours et Tutoriels

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Décembre 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    J'ai utilisé la commande os.popen mais sur mes machines sa ping pas ?? au moins avoir 2 requetes de ping.
    Fichiers attachés Fichiers attachés

  6. #6
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Voilà quelque chose qui a l'air de fonctionner.

    Attention: c'est du Python 2.7 sous Windows (donc: console="cmd.exe" et encodage="cp850"): à convertir si nécessaire.

    Envoi d'un ping et récupération de la réponse

    J'utilise le module subprocess (=solution recommandé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
    import subprocess
     
    #############################################################################
    def ping_pc(ip, encodage="cp850"):
        """envoie un ping à l'ordinateur d'adresse ip, et retourne la réponse
           sous forme d'une liste de lignes unicode
        """    
        commande = ["ping", ip]
        try:
            out, _ = subprocess.Popen(commande, 
                                      stdout=subprocess.PIPE, 
                                      stderr=subprocess.STDOUT).communicate()
        except (ValueError, OSError) as err:
            return ("Erreur: %s" % (err.args[0],)).decode(encodage)
        reponse = out.decode(encodage)
        return reponse.splitlines()
    Exploitation de la réponse du ping

    Selon la situation de l'adresse ip fournie, la réponse sera la suivante:

    Cas d'erreur: retour d'une seule ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    La requête Ping n'a pas pu trouver l'hôte www.xxxxxxxxx.fr. Vérifiez le nom et essayez à nouveau.
    Cas d'un PC connecté (c'est ici mon disque réseau):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Envoi d'une requête 'Ping'  192.168.1.70 avec 32 octets de données*:
    Réponse de 192.168.1.70*: octets=32 temps<1ms TTL=64
    Réponse de 192.168.1.70*: octets=32 temps<1ms TTL=64
    Réponse de 192.168.1.70*: octets=32 temps<1ms TTL=64
    Réponse de 192.168.1.70*: octets=32 temps<1ms TTL=64
     
    Statistiques Ping pour 192.168.1.70:
        Paquets*: envoyés = 4, reçus = 4, perdus = 0 (perte 0%),
    Durée approximative des boucles en millisecondes :
        Minimum = 0ms, Maximum = 0ms, Moyenne = 0ms
    A noter: la 1ère ligne est vide

    Cas d'un PC non connecté (le PC est éteint):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Envoi d'une requête 'Ping'  192.168.1.91 avec 32 octets de données*:
    Réponse de 192.168.1.100*: Impossible de joindre l'hôte de destination.
    Réponse de 192.168.1.100*: Impossible de joindre l'hôte de destination.
    Réponse de 192.168.1.100*: Impossible de joindre l'hôte de destination.
    Réponse de 192.168.1.100*: Impossible de joindre l'hôte de destination.
     
    Statistiques Ping pour 192.168.1.91:
        Paquets*: envoyés = 4, reçus = 4, perdus = 0 (perte 0%),
    Il y a encore une 1ère ligne vide.

    On voit que, par rapport au PC connecté, les 2 dernières lignes sont absentes. On pourrait aussi tester le texte "Impossible de joindre...", mais on aurait des problèmes de langue à gérer.

    Pour l'exploitation de la réponse au ping, on va donc adopter la logique suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    si la 1ère ligne n'est pas vide:
        => erreur
    sinon:
        on recherche la 1ère ligne vide suivante
        s'il y a plus de 2 lignes après celle-ci:
            => le PC est connecté
        sinon:
            => le PC n'est pas connecté
    Voilà le code:

    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
    #############################################################################
    def connectok(ip):
        """dit si un PC dont l'adresse ip est donnée, est connecté ou non"""
        # envoi d'un ping à l'ip donné et saisie de la réponse
        lignes = ping_pc(ip)
     
        # si la 1ère ligne (=indice 0) n'est pas vide: erreur d'adresse
        if len(lignes[0])!=0:
            return ip + u" => nom de domaine introuvable"
        else:
            # recherche de la 1ère ligne vide au delà de la 1ère (=> indice k)
            for i, ligne in enumerate(lignes[1:]):
                if len(ligne)==0: 
                    k = i+1 
                    break
            if len(lignes)-k > 3:
                return ip + u" => connecté"
            else:
                return ip + u" => non connecté"
    Exemple d'utilisation:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ip1 = "192.168.1.70" # PC connecté
    ip2 = "192.168.1.91" # PC non connecté
    ip3 = "www.google.fr" # adresse web valide (=> accès serveur DNS)
    ip4 = "www.googleXXX.fr" # mauvaise adresse web (=> échec serveur DNS)
    ips = [ip1, ip2, ip3, ip4]
     
    for ip in ips:
        print connectok(ip)
    Réponse:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    192.168.1.70 => connecté
    192.168.1.91 => non connecté
    www.google.fr => connecté
    www.googleXXX.fr => nom de domaine introuvable
    Je n'ai pas essayé sur Linux ou sur OS X, mais on devrait pouvoir s'inspirer du cas Windows ci-dessus pour adapter si nécessaire.

    Ok?
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  7. #7
    Expert éminent

    Avatar de deusyss
    Homme Profil pro
    Expert Python
    Inscrit en
    Mars 2010
    Messages
    1 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Expert Python
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 659
    Points : 8 442
    Points
    8 442
    Par défaut
    Tyrtamos, belle explication. Sous Linux, (je n'ai pas le temps de teser là), une petite mise en garde par contre, car de memoire, le ping ne s'arrete pas sauf si on fait un ctrl-C.

    Utiliser la commande ping -c <nb_fois> <adresse_IP>
    "La connaissance appartient à tout le monde" (Film Antitrust)

    Tout le nécessaire pour Python:
    *News/Accueil *Cours/tutoriels *FAQ
    *Forums *Outils dédiés *Mon espace personnel avec mes Articles, Cours et Tutoriels

  8. #8
    Nouveau Candidat au Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Décembre 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Daccord.
    Bah merci bien les expert de .. Python . Je vais essayer alors

Discussions similaires

  1. Probleme ping sous perl
    Par calimero642 dans le forum Programmation et administration système
    Réponses: 8
    Dernier message: 29/03/2006, 15h59
  2. Problème avec ifconfig, ping... sous linux
    Par boubouc dans le forum Applications et environnements graphiques
    Réponses: 2
    Dernier message: 12/02/2006, 16h15
  3. Fonction addslashes sous Python ?
    Par ecocentric dans le forum Général Python
    Réponses: 2
    Dernier message: 28/01/2006, 18h27
  4. Existe-t-il un rad sous python?
    Par sloshy dans le forum EDI/RAD
    Réponses: 6
    Dernier message: 03/10/2005, 09h26
  5. Ping sous protocole TCP (et non UDP)
    Par ovdz dans le forum Développement
    Réponses: 2
    Dernier message: 19/06/2003, 14h10

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