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 :

SSH paramiko et message d'erreur


Sujet :

Python

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Mai 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mai 2012
    Messages : 7
    Points : 1
    Points
    1
    Par défaut SSH paramiko et message d'erreur
    Bonjour,

    Tout d'abord je suis débutant, d'aujourd'hui sur python.

    J'ai à créer un script pour me connecter en SSH sur plusieurs serveurs pour y exécuter la même commande.
    Je souhaiterais récupérer les éventuels messages d'erreur générés par cette ligne de commande (exécutée sur une machine distante) pour les enregistrer dans un fichier de log que j'ai créé (sur ma machine, local).
    pour exécuter ma commande j'ai cette instruction:

    stdin, stdout, stderr = ssh.exec_command(cmd)

    J'imagine que je dois utiliser le stderr, mais je ne comprends comment celui-ci fonctionne

    merci de votre aide

    willou

  2. #2
    Membre expérimenté Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Points : 1 728
    Points
    1 728
    Par défaut
    Bonjour,

    essaye fabric, ça devrait répondre à ton besoin.

    Bon python
    "Etre conscient de la difficulté permet de l'éviter.."
    Lao-Tseu.

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Mai 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mai 2012
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    merci pour ta réponse, mais l'usage de paramiko (et seulement) est imposé comme une norme de codage

    j'ai un peu avancé dans ma réflexion

    ma ligne stdin, stdout, stderr = ssh.exec_command(cmd)

    se trouvant dans une boucle, ces trois éléments sont-ils écrasés à chaque itérations?

    si c'est le cas, n'est-ce pas possible de faire un truc du genre:

    logFile.write(stderr)

    ?

    de façon général, je pense ne pas bien comprendre en quoi consiste stdin, stdout et stderr dans la ligne de code ci-dessus.

  4. #4
    Membre éprouvé

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Points : 1 273
    Points
    1 273
    Par défaut
    se trouvant dans une boucle, ces trois éléments sont-ils écrasés à chaque itérations?
    Ben oui*!

    de façon général, je pense ne pas bien comprendre en quoi consiste stdin, stdout et stderr dans la ligne de code ci-dessus.
    Ce sont des pseudo-fichiers (des sous-classes d’IOBase, voir le module io), “ouverts” en écriture pour stdin, et en lecture pour stdout et stderr… Donc faut utiliser la même syntaxe qu’avec les objets renvoyés par open()*:


  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Mai 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mai 2012
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    merci beaucoup de votre aide

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Mai 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mai 2012
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    nouveau problème

    mon script doit exécuter une commande sur plusieurs serveurs distant dont les adresses ip se trouvent dans un fichier que je parcours

    dans ma boucle sur les IP j'ai ça:
    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
     
     try:
          sshc = paramiko.SSHClient()
          sshc.set_missing_host_key_policy(paramiko.AutoAddPolicy())
          sshc.connect(hostname=currentIP, username='root', password= passwd)
     
     
          cmd = "ls -l"
          stdin, stdout, stderr = sshc.exec_command(cmd)
          sshc.close()
    #write in the log file result from the command NTP
          scriptLog.write(stderr.read()+'\n')
    #SSH connexion excpection handling
      except paramiko.AuthenticationException:
          scriptLog.write("AuthenticationException\n")
      except paramiko.BadHostKeyException:
          scriptLog.write("BadHostKeyException\n")
      except paramiko.ChannelException:
          scriptLog.write("ChannelException\n")
    j'ai le en plantage :

    No handlers could be found for logger "paramiko.transport"

    qui intervient au moment du sshc.exec_command(cmd)

    Petite précision, si je ne met dans la liste des adresses IP seulement l'adresse ip de la machine sur laquelle j'exécute le script (un peu con con, mais c'est pour le test) je n'ai aucune erreur.

    D'après ce que j'ai vu sur le net, ça ressemble à un bug de paramiko mais le pb c'est que je n'ai pas trouvé de correctif

    merci de votre aide

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,
    Ce n'est pas un "bug", paramiko suppose que vous avez configuré le module logging pour lui envoyer des messages d'erreurs et d'information.
    Ajoutez juste:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    import logging
    logging.basicConfig()
    au début du script qui sert de '__main__'

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  8. #8
    Nouveau Candidat au Club
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Mai 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mai 2012
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    merci mais j'ai du coup un


    ERROR:paramiko.transport:Socket exception: Bad file descriptor (9)

    sachant que je suis en python 2.3 et paramiko 1.6.4

    j'ai essayé avec le même code et le même fichier à parcourir sur python 2.6 et paramiko 1.7.5 et ça marche, j'aimerais trouver une solution plus souple que d'imposer un upgrade de python...

  9. #9
    Nouveau Candidat au Club
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Mai 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mai 2012
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    j'en profite pour une autre question:
    je comptais utiliser les stdout et stderr de mon instruction :


    stdin, stdout, stderr = sshc.exec_command(cmd)

    pour récupérer des infos sur la machine distante
    typiquement je souhaite connaître le statut d'un service
    je vais avoir cmd="/etc/init.d/monService status"
    et là, j'aimerais récupérer la réponse à cette commande
    or dans stdout et stderr je n'ai que le comportement de paramiko:

    <paramiko.ChannelFile from <paramiko.Channel 2 (closed) -> <paramiko.Transport at xxxx (unconnected)>>>

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Citation Envoyé par willoucheck Voir le message
    ERROR:paramiko.transport:Socket exception: Bad file descriptor (9)
    sachant que je suis en python 2.3 et paramiko 1.6.4

    j'ai essayé avec le même code et le même fichier à parcourir sur python 2.6 et paramiko 1.7.5 et ça marche, j'aimerais trouver une solution plus souple que d'imposer un upgrade de python...
    En effet, migrer d'anciennes applications qui fonctionnent très bien sous Python 2.3 "juste pour" qu'elles tournent sous une version plus récente n'est pas raisonnable.

    Ceci dit, rien n'empêche de faire coexister plusieurs environnements Python sur le même OS et donc d'écrire vos nouvelles applications sous une version plus récente.
    Après c'est vous qui voyez...

    Pour ce qui est de:
    stdin, stdout, stderr = sshc.exec_command(cmd)

    pour récupérer des infos sur la machine distante
    typiquement je souhaite connaître le statut d'un service
    je vais avoir cmd="/etc/init.d/monService status"
    C'est du debug "end to end" pour ingé systeme Linux(*), est ce que:
    - ca fonctionne "hors" paraliko/python?
    - vous arrivez a récupérer la sortir d'un "ls" "avec" paramiko?
    (*) c'est un vrai job qui n'a rien a voir avec la programmation Python et en plus il faut une configuration "minimale" pour tester...

    Cordialement,

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  11. #11
    Nouveau Candidat au Club
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Mai 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mai 2012
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    bon,
    Je touche près du but:
    avec python 2.6, paramiko 1.7.5 tout marche.
    avec l'algo suivant

    boucle sur mes IP
    try connexion, commande SSH
    except 1
    .
    .
    except n
    finally:
    si connexion ssh alors fermeture ssh

    de plus je récupère bien ce que je veux dans le stdout

    maintenant, en python 2.3 paramiko 1.6.4:
    la soluce import logging logging.basicConfig() fonctionne

    par contre il s'avère qu'on peut faire cohabiter dans un même try des excepts et des finally qu'à partir de python 2.5

    or si je n'ai pas ce finally et qu'une erreur se produit, alors la connexion SSH ne se ferme pas et les traitements suivant de la boucles dysfonctionnent.

    si je décide de fermer la connexion dans chaque except et else, quand je provoque l'except j'ai le msg suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      File "scriptNTP.py", line 88, in ?
        sshc.close()
      File "/usr/lib/python2.3/site-packages/paramiko/client.py", line 283, in close
        self._transport.close()
    AttributeError: 'NoneType' object has no attribute 'close'
    j'ai un autre problème, beaucoup moins bloquant qui est l'apparition sur ma console du message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ERROR:paramiko.transport:Socket exception: Bad file descriptor (9)
    dès qu'une connexion est un peu lente
    ceci ne bloque pas l'exécution mais je voudrais m'en débarrasser (il intervient car j'ai dans mon try un except socket.error pour gérer les no route to host)

    merci encore pour votre aide

Discussions similaires

  1. Message d'erreur inconnu connexion ssh
    Par SupraPF dans le forum Langage
    Réponses: 9
    Dernier message: 26/06/2015, 11h22
  2. Erreur "new key" ssh paramiko
    Par Leniouns dans le forum Bibliothèques tierces
    Réponses: 1
    Dernier message: 05/09/2012, 13h14
  3. message d'erreur sur Net::SSH et Net::SCP
    Par dm.mya dans le forum Langage
    Réponses: 0
    Dernier message: 11/05/2012, 15h52
  4. [CR] Message d'erreur
    Par nono1 dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 11/09/2002, 14h54
  5. Réponses: 2
    Dernier message: 27/05/2002, 19h46

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