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

Python Discussion :

Telnet et condition sur ce qui est lu


Sujet :

Python

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 2008
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2
    Par défaut Telnet et condition sur ce qui est lu
    -- edit par Jackho : J'aurai peut etre du mettre ce message dans la section Réseau.... --


    Bonjour à tous,

    j'ai commencé hier à me plonger dans Python pour réaliser un programme se connectant en telnet sur plusieurs routeurs pour leur envoyer des lignes de commandes.
    Je récupère dans 2 fichiers l'adresse des routeurs (host) (et le mdp) et dans l'autre fichier les commandes à exécuter.

    Mais il se peut qu'une de ces commandes ne s'éxécute pas correctement auquel cas une erreur est retournée (sans pour autant empecher le programme de continuer son exécution).

    Par exemple en rentrant une mauvaise ligne de commande je pourrai ressortir avec l'erreur "% Invalid input detected at '^' marker."

    Je souhaiterai donc etre capable de détecter cette erreur afin d'afficher un message d'erreur et modifier le fonctionnement du programme (éviter l'insertion des autres lignes de commandes).

    J'ai essayé ceci, qui ne marche pas:
    if tn.read_until("% Invalid input detected at '^' marker."):

    et j'ai aussi essayé, sans succes, avec tn.expect("% Invalid input detected at '^' marker.")

    Comment puis-je faire ? Je suis sur que c'est tout bete mais je ne sais pas comment faire.

    Merci d'avance

    _____ Sylvain _____

    Voici mon 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
    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
    # -*- coding: cp1252 -*-
    import os
    import sys
    import telnetlib
     
     
    login = "calcejo"
     
    ## Boucle sur liste.txt contenant les hostnames
    file=open('liste.txt','r')
     
    for ligne in file.readlines() :
        donnees = ligne.split()
     
        Host = donnees[0]
        password = donnees[1]
     
        try :
            tn = telnetlib.Telnet(Host)
            print "_______________________"
            print Host
     
            ok = tn.read_until("Username: ",1)
            print ok
     
            tn.write(login + "\n")
            if password:
                tn.read_until("Password: ")
                tn.write(password + "\n")
                ## Boucle sur commandes.txt contenant les commandes
                file2=open('commandes.txt','r')
                for ligne2 in file2.readlines() :
                    tn.write(ligne2)
     
                tn.write("exit\n")
                print tn.read_all()
                file2.close()
     
        except:
            print "_______________________"
            print "Erreur d'accès en Telnet sur : ", Host
            continue
     
    ## Ferme le fichier liste.txt  
    file.close()

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Par défaut
    Avec expect, cela devrait fonctionner, mais il faut l'utiliser correctement.
    En supposant que le prompt du routeur se termine par un # (code non testé):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ...
    for ligne2 in file2:
      tn.write(ligne2)
      result = tn.expect(["Invalid input detected", "#"])
      if result[0] == 0:   # la première expression a matché
        break              # arrêter l'envoi des commandes
    ...

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

    Informations forums :
    Inscription : Août 2008
    Messages : 2
    Par défaut
    Merci pour votre réponse j'ai justement testé ce que vous m'avez indiqué hier soir. Ca fonctionne bien

    Je remet mon code pour ceux qui souhaiterait posséder un outil qui inscrit sur plusieurs routeurs des commandes prédéfinies (en n'oubliant pas de créer les 2 fichiers auparavant). A savoir qu'il ets assez basique et je ne promet pas qu'il soit super bien codé !!

    liste.txt : contient sur chaque ligne l'hostname + mdp d'un routeur (séparé par un espace)

    commandes.txt : contient la liste de la commande à insérer dans la config du routeur.

    code:
    gère aussi les erreurs : hostname pas joignable en telnet, commande à insérer non valide, erreur si on demande seulement le mdp pour se connecter (et non login puis mdp). Il me reste à metre en place les timeouts....je galère la

    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
     
    # -*- coding: cp1252 -*-
    import os
    import sys
    import telnetlib
     
     
    login = "calcejo"
     
    ## Boucle sur liste.txt contenant les hostnames
    file=open('liste.txt','r')
     
    for ligne in file.readlines() :
        donnees = ligne.split()
     
        Host = donnees[0]
        password = donnees[1]
     
        try :
            tn = telnetlib.Telnet(Host)
            print "_______________________"
            print Host
     
            j = tn.expect(['Password: ','Username: '])
            if j[0] == 0:
                print "--> Erreur : Bad Password "
                continue
     
            ok = tn.read_until("Username: ",1)
            #print ok
            tn.write(login + "\n")
            if password:
                tn.read_until("Password: ")
     
                #k = tn.expect(['.* timeout'])
                #if k[0] == 0:
                #    print "--> Timeout "
                #    continue
     
                tn.write(password + "\n")
                ## Boucle sur commandes.txt contenant les commandes
                file2=open('commandes.txt','r')
                for ligne2 in file2.readlines() :
                    tn.write(ligne2)
                    i = tn.expect(['% Invalid input detected at .*','.*#'])
                    if i[0] == 0:
                        test = ligne2.strip()
                        print "--> Erreur : Invalid input detected --> '",test,"'"
     
                tn.write("exit\n")
                #print tn.read_all()
                file2.close()
     
        except:
            print "_______________________"
            print "Erreur d'accès en Telnet sur : ", Host
            continue
     
    ## Ferme le fichier liste.txt  
    file.close()

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

Discussions similaires

  1. Condition sur checkbox qui ne marche pas
    Par rebk2013 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 22/06/2013, 16h14
  2. datagridview Action sur ce qui est affiché
    Par dragondumond dans le forum VB.NET
    Réponses: 8
    Dernier message: 03/04/2013, 19h21
  3. 1 enregistrement sur 2 qui est retourné
    Par berceker united dans le forum iReport
    Réponses: 1
    Dernier message: 29/11/2006, 16h07
  4. Réponses: 5
    Dernier message: 10/01/2006, 17h23

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