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 :

Paramiko - Création fichier local vide [Python 3.X]


Sujet :

Réseau/Web Python

  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2013
    Messages : 198
    Par défaut Paramiko - Création fichier local vide
    Bonjour,

    nouveau dans python je cherche à faire une chose simple (je pensais), se connecter un équipements en SSH, récupérer le résultat d'une commande et écrire le résultat dans un fichier sur l'hote local avec le nom du fichier contenant le nom de la machine locale.

    Le problème ...le fichier crée reste vide ...
    La variable dst_file devant contenir le résultat est vide.

    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
    #PYTHON3
     
    import paramiko
     
    host = "192.168.109.10"
    port = 22
    username = "admin"
    password = "admin"
    command = "show int status"
     
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect(host, port, username, password)
     
    stdin, stdout, stderr = ssh.exec_command(command)
    lines = stdout.readlines()
     
    ssh.close()
     
    path = '/home/toto/Python_script/'
    file_dst = '%s%s.txt' %(path,host)
     
    new_file = open(file_dst, 'w')
    new_file.write(lines)
    new_file.close()
    Merci pour votre aide.

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 790
    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 790
    Par défaut
    Salut,

    Est ce qu'il y a quelque chose dans lines? Parce que dst_file ne contient que le nom du ficher.
    Après il faut aussi vérifier que la commande s'est exécuté correctement avant de faire quelque chose du résultat.

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

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2013
    Messages : 198
    Par défaut
    Bonjour,

    merci pour le retour.

    quand je fait un print(lines) j'obtiens le résultat ci-dessous.

    ['\r\n', '\r\n', 'Port Name Status Vlan Duplex Speed Type \r\n', 'Gi0/0 connected 1 auto auto unknown\r\n', 'Gi0/1 connected 1 auto auto unknown\r\n', 'Gi0/2 connected 1 auto auto unknown\r\n', 'Gi0/3 connected 1 auto auto unknown\r\n', 'Gi1/0 connected 1 auto auto unknown\r\n', 'Gi1/1 connected 1 auto auto unknown\r\n', 'Gi1/2 connected 2 auto auto unknown\r\n', 'Gi1/3 connected 2 auto auto unknown\r\n', 'Gi2/0 connected 2 auto auto unknown\r\n', 'Gi2/1 notconnect 3 auto auto unknown\r\n', 'Gi2/2 notconnect 1 auto auto unknown\r\n', 'Gi2/3 notconnect 1 auto auto unknown']

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 790
    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 790
    Par défaut
    Salut,

    Dans ce cas, l'instruction de la ligne 24 (new_file.write(lines)) devrait afficher un message d'erreur expliquant pourquoi çà ne peut pas écrire dans le fichier (et du coup le fichier est vide).

    Après il faut pas rêver: écrire un programme qui marche, c'est corriger des fautes d'orthographes et des oublis qui dégénèrent en erreurs et résultats surprenants.
    Normalement, on apprend à programmer avec un tuto. et on se familiarise avec les messages d'erreur (que faire lorsque...).
    Et on revoit le chapitre sur les fichiers pour voir comment on écrit une liste ou on évite de créer une liste.

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

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2013
    Messages : 198
    Par défaut
    Effectivement il y avait ce message.

    new_file.write(lines)
    TypeError: write() argument must be str, not list
    J'ai trouvé la solution en regardant vite fait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    listToStr = ' '.join(map(str, lines))
    Ca donne


    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
    #PYTHON3
     
    import paramiko
    #paramiko.util.log_to_file("paramiko.log")
     
     
    host = "192.168.109.10"
    port = 22
    username = "admin"
    password = "admin"
    command = "show int status"
     
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect(host, port, username, password)
     
    stdin, stdout, stderr = ssh.exec_command(command)
    lines = stdout.readlines()
     
    ssh.close()
     
    path = '/home/alexandre/Python_script/'
    file_dst = '%s%s.txt' %(path,host)
    print(file_dst)
     
    print(lines)
     
    for ligne in lines:
     print(ligne, end = '')
     
    listToStr = ' '.join(map(str, lines))
     
    new_file = open(file_dst, 'w')
    new_file.write(listToStr)
    new_file.close()
    Merci pour l'aide.

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 790
    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 790
    Par défaut
    Salut,

    Vous pourriez aussi écrire à la ligne 18: lines = stdout.read() et alors ligne 34 le new_file.write(lines) fonctionnerait aussi.

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

  7. #7
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2013
    Messages : 198
    Par défaut
    j'y pensais justement pour faire plus simple.

    En utilisant ligne 18: je retrouve le message d'erreur suivant et le fichier crée est vide.


    new_file.write(lines)

    Quand j'affiche le contenue de lines j'ai ce résultat
    13101310801111141163232323232327897109101323232323232323232323232323232831169711611711532323232323232861089711032323232323232681171121081011203232831121011011003284121112101321310711054847483232323232323232323232323232323232323232323232329911111011010199116101100323232324932323232323232323232323297117116111323232971171161113211711010711011111911013107110548474932323232323232323232323232323232323232323232323299111110110101991161011003232323249323232323232323232323232971171161113232329711711611132117 ETC
    Peut être ressortir le résultat en liste est une obligation du module ?

  8. #8
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 790
    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 790
    Par défaut
    Salut,

    Citation Envoyé par caramon _majere Voir le message
    En utilisant ligne 18: je retrouve le message d'erreur suivant et le fichier crée est vide.
    Le message d'erreur est important car il indique non seulement l'erreur mais la ligne qui l'a provoquée. Et le fait que vous ne l'ayez pas posté montre que vous ne savez pas trop quoi en faire... pourtant, les lire pour en tirer des informations pertinentes sur quoi faire est une étape incontournable.


    Citation Envoyé par caramon _majere Voir le message
    Quand j'affiche le contenue de lines j'ai ce résultat
    Peut être ressortir le résultat en liste est une obligation du module ?
    Ca veut surtout dire que paramiko stdout.read() vous a retourné quelque chose et que le programme plante plus loin mais pas forcément à la ligne que vous indiquez (mais à celle indiquée par le message d'erreur).

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

  9. #9
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2013
    Messages : 198
    Par défaut
    avec lines = stdout.read()

    j'obtiens une <classe bytes> et le message d'erreur suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <class 'bytes'>
    Traceback (most recent call last):
      File "test.py", line 28, in <module>
        new_file.write(lines)
    TypeError: write() argument must be str, not bytes

    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
    #PYTHON3
     
    import paramiko
    #paramiko.util.log_to_file("paramiko.log")
     
     
    host = "192.168.109.10"
    port = 22
    username = "admin"
    password = "admin"
    command = "show int status"
     
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect(host, port, username, password)
     
    stdin, stdout, stderr = ssh.exec_command(command)
    lines = stdout.read()
     
    ssh.close()
     
    print(type(lines))
     
    path = '/home/alexandre/Python_script/'
    file_dst = '%s%s.txt' %(path,host)
     
    new_file = open(file_dst, 'w')
    new_file.write(lines)
    new_file.close()

  10. #10
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 790
    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 790
    Par défaut
    Salut,

    Il n'est pas très cohérent côté paramiko de retourner des bytes avec .read et des str avec .readlines: çà devrait être la même chose dans les 2 cas.

    Après, avec un read, le print(lines) devrait commencer par un b'...

    Donc je ne sais pas trop si ce que vous montrez est "fiable".
    Ceci dit, pour écrire des bytes dans un fichier, il suffit de l'ouvrir en mode binaire: 'wb'.

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

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

Discussions similaires

  1. [X3-V6] Erreur lors de la création de fichier local
    Par jeromecha dans le forum SAGE
    Réponses: 2
    Dernier message: 05/07/2019, 09h28
  2. [Apache POI] création d'un fichier Word vide
    Par reeda dans le forum API standards et tierces
    Réponses: 0
    Dernier message: 10/03/2010, 18h08
  3. Réponses: 5
    Dernier message: 22/01/2008, 12h25
  4. [VBA-E]Création fichier EXCEL et détection cellule vide
    Par benoue dans le forum Macros et VBA Excel
    Réponses: 18
    Dernier message: 24/02/2006, 17h22
  5. Création fichier MDE
    Par faventin dans le forum Access
    Réponses: 4
    Dernier message: 25/10/2004, 15h03

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