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 :

Télécharger une partie d'un fichier en SCP/SSH


Sujet :

Python

  1. #1
    Membre éclairé
    Inscrit en
    Octobre 2005
    Messages
    908
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 908
    Par défaut Télécharger une partie d'un fichier en SCP/SSH
    Bonjour,

    J'utilise un p'tit script pour télécharger un log en SCP / SSH.
    Le fichier log devient volumineux et j'aimerai ne télécharger qu'une partie de ce fichier.
    Fichier log :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    id=firewall time="2013-09-04 11:55:38" ...
    id=firewall time="2013-09-04 17:15:56" ...
    id=firewall time="2013-09-05 11:55:38" ...
    id=firewall time="2013-09-06 17:15:56" ...
    id=firewall time="2013-09-08 11:55:38" ...
    id=firewall time="2013-09-08 12:55:38" ...
    id=firewall time="2013-09-08 13:55:38" ...
    id=firewall time="2013-09-09 17:15:56" ...
    Le but serait de récupérer tous les log d'une certaine journée.

    Actuellement j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
     
    import time, os
     
    date = time.strftime("%Y%m%d-%H%M%S", time.localtime())
     
    os.system('scp -q -P 22 -r admin@host:/smtp.log '+date+'-smtp.log')
    Merci pour votre aide

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 114
    Par défaut
    Bonjour

    Pas de solution avec scp.
    Par contre, avec un ssh + command (cat/grep sed ... à déterminer), ou u programme python sur la machine distante, oui c'est faisable.

    Pour ce problème :
    - ce n'est pour l'instant pas trop un problème python
    - c'est plus un problème de ssh, ou de réseau
    - Pour avancer concrètement, il faut clarifier ce qu'est "une partie de ce fichier" : comment sait-t-on qu'une ligne du fichier est à prendre ou pas ? De la réponse à cette question, découlera des pistes.

    Cordialement
    Emmanuel

  3. #3
    Membre éclairé
    Inscrit en
    Octobre 2005
    Messages
    908
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 908
    Par défaut
    Merci pour votre réponse.

    j'ai peut être mal formulé ma demande...
    Le but serait de récupérer tous les log d'une certaine journée.
    Autrement dit, j'aimerai qu'à travers mon script python, celui me demande une date :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    jour = raw_input('jour (AAAA-MM-JJ):')
    Si je spécifie "2013-09-08", le script me récupère en amont tous les logs de la journée du 2013-09-08 sans être obligé de télécharger le log en entier (>100Mo)

  4. #4
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    readline() est là pour ça.

    Tu peux aisément te faire un itérateur, exemple:
    (Je n'ai pas de fichier log sous la main, mais c'est pareil)
    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
     
    # -*- coding: utf-8 -*-
     
    FILE = '/home/vincent/g9n/GPSout.gpx'
     
    def get_lines():
        inf = open(FILE, 'r')
        stream = inf.readline
        while 1:
            l = stream()
            if not l:
                break
            if '<name>track' in l:
                yield l
        inf.close()
     
    for line in get_lines():
        print line
    Simple, rapide et le fichier n'est pas chargé en mémoire.

  5. #5
    Membre éclairé
    Inscrit en
    Octobre 2005
    Messages
    908
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 908
    Par défaut
    Bonjour VinsS,
    J'ai des notions en prog, aucune en python mais là j'ai l'impression que ton bout de code ne correspond pas à ce que je souhaite...
    Il est question ici de récupérer une partie d'un fichier log distant sans chargement total du fichier.

  6. #6
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Citation Envoyé par Tchupacabra Voir le message
    Il est question ici de récupérer une partie d'un fichier log distant sans chargement total du fichier.
    C'est exactement ce que fait ce code exemple, il ne retourne que les lignes du fichier qui répondent à un (des) critère(s) sans charger l'entièreté en mémoire. Bref, ce que tu demande.

  7. #7
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Un exemple plus proche de ce que tu attend.

    actions.log
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    id=firewall time="2013-09-04 11:55:38" un
    id=firewall time="2013-09-04 17:15:56" deux
    id=firewall time="2013-09-05 11:55:38" trois
    id=firewall time="2013-09-06 17:15:56" quatre
    id=firewall time="2013-09-08 11:55:38" cinq
    id=firewall time="2013-09-08 12:55:38" six
    id=firewall time="2013-09-08 13:55:38" sept
    id=firewall time="2013-09-09 17:15:56" huit
    script.py
    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
     
    # -*- coding: utf-8 -*-
     
    FILE = '/home/vincent/oqapy-1/g9n/actions.log'
    CRITERION = "2013-09-08"
     
    def get_lines(text):
        inf = open(FILE, 'r')
        stream = inf.readline
        while 1:
            l = stream()
            if not l:
                break
            if text in l:
                yield l
        inf.close()
     
    log = []
    for line in get_lines(CRITERION):
        log.append(line)
     
    print "".join(log)
    Retour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    vincent@djoliba:~/oqapy-1/g9n$ python script.py 
    id=firewall time="2013-09-08 11:55:38" cinq
    id=firewall time="2013-09-08 12:55:38" six
    id=firewall time="2013-09-08 13:55:38" sept
    C'est bon ou pas ?

  8. #8
    Membre éclairé
    Inscrit en
    Octobre 2005
    Messages
    908
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 908
    Par défaut
    Merci beaucoup pour ton aide mais je vois pas comment ton script fait pour se connecter au système de fichier distant (firewall NetASQ sous FreeBSD)

    Désolé pour mes lacunes...

  9. #9
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Ça c'est une toute autre question. À laquelle je n'ai pas de réponse d'ailleurs.


    Tu devrais ouvrir un nouveau fil de discussion en précisant cette question dans le titre pour attirer l'attention de personnes qui traitent ce genre de procédure.


    Edit: Le premier lien trouvé sur Google:

    http://stackoverflow.com/questions/2...-scp-in-python

  10. #10
    Membre éclairé
    Inscrit en
    Octobre 2005
    Messages
    908
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 908
    Par défaut
    Citation Envoyé par VinsS Voir le message
    Edit: Le premier lien trouvé sur Google:

    http://stackoverflow.com/questions/2...-scp-in-python
    je n'ai pas de problème avec SCP...
    Citation Envoyé par Tchupacabra Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
     
    import time, os
     
    date = time.strftime("%Y%m%d-%H%M%S", time.localtime())
     
    os.system('scp -q -P 22 -r admin@host:/smtp.log '+date+'-smtp.log')
    fonctionne très bien mais me télécharge 134 Mo de log...

  11. #11
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    D'accord, mais ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    os.system('scp -q -P 22 -r admin@host:/smtp.log '+date+'-smtp.log')
    ce n'est pas du Python.

    os.system ne fait que lancer une commande telle que tu l'aurais lancée en console mais il ne participe pas au travail effectué.

    Si tu veux que ce soit Python qui fasse le travail afin, par exemple, de ne lire que les lignes qui t'intérressent, il faudra utiliser un des modules existant pour Python.

  12. #12
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 31
    Par défaut
    Salut !
    TU pourrai par exemple utiliser paramiko , la lib SSH de python :
    https://github.com/paramiko/paramiko
    tu fait un "cat grep madate " et c'est banco , ton serveur de log va grepper juste les lignes avec ta chaine de charactere et c'est bon !

    J

Discussions similaires

  1. Supprimer une partie d'un fichier
    Par onet dans le forum Linux
    Réponses: 2
    Dernier message: 05/01/2007, 19h13
  2. [DOM] Récupérer une partie d’un fichier HTML
    Par fadex dans le forum Bibliothèques et frameworks
    Réponses: 4
    Dernier message: 05/01/2007, 12h30
  3. Awk extraire une partie d'un fichier
    Par titexe dans le forum Linux
    Réponses: 2
    Dernier message: 30/11/2006, 11h54
  4. [VB6]Lire une partie d'un fichier .txt
    Par patoch76 dans le forum VB 6 et antérieur
    Réponses: 26
    Dernier message: 02/05/2006, 20h49
  5. [VB]recherche dans une partie d'un fichier texte
    Par malhivertman1 dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 19/01/2006, 11h56

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