Forum Programmation.python scapy sortie standard

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
2
12
mai
2016

Bonjour,

Je travaille actuellement sur un projet utilisant scapy, pour ce projet je dois sniffer un réseau et sortie uniquement les adresses IP sources et destinations, les ports sources et destinations ainsi que le protocole.

J'ai donc fait un petit script :

import sys
from scapy.all import *

pkts = sniff(prn=lambda x:x.sprintf("{IP:%IP.src%,%IP.sport%,%IP.dst%,%IP.dport%,%IP.proto%,%IP.time%}"))

Qui me renvoie bien les données souhaité, mais je souhaiterai que la sortie standard soit envoyé vers un fichier (il y a bien une méthode sous scapy pour exporter mais elle génère un fichier pcap ce qui ne correspond pas à mon cahier des charges)

Actuellement j'exécute mon script "à la main" et j'utilise le ">" pour rediriger vers un fichier, mais je souhaiterai automatiser ce script (j'en est fait un service(daemon)) mais mon problème est la, comment faire pour rediriger la sortie standard ? Est-il possible d'utiliser le chevron ?

J'ai vu qu'il y avait la fonction std.output mais j'avoue que je ne sais pas vraiment comment l'utiliser

Si quelqu'un à une idée je suis preneur

  • # Bonjour

    Posté par  . Évalué à 4. Dernière modification le 12 mai 2016 à 17:03.

    En Python3 tu peux spécifier un fichier à la fonction print():

    print('Hello', file=sys.stdout)

    est équivalent à un simple print('Hello'), ça sort sur la sortie standard. Tu as aussi sys.stderr pour la sortie d’erreur standard. Il faut bien sur avoir fait un import sys comme tu l’as fait dans ton exemple pour que ça fonctionne.

    Tu peux indiquer n’importe quel descripteur de fichier. Pour en créer un en Python :

    https://docs.python.org/3/tutorial/inputoutput.html#reading-and-writing-files

    f = open('nom_de_fichier', 'w')
    print('Hello',file=f)
    f.close()

    pour écrire dans le fichier 'nom_de_fichier', tout simplement.

    On pourrait aussi écrire : f.write('Hello') au lieu d’utiliser la fonction print()…

  • # réponse

    Posté par  . Évalué à 0.

    Merci de ta réponse,

    J'ai essayer plusieurs chose mais sans résultat, je suppose que je m'y prend mal, des conseils ?

    import sys
    from scapy.all import *

    r = open('test', 'w')

    print(' pkts = sniff(prn=lambda x:x.sprintf("{IP:%IP.src%,%IP.sport%,%IP.dst%,%IP.dport%,%IP.proto%,%IP.time%}"))', file=f)

    r.close()

    • [^] # Re: réponse

      Posté par  . Évalué à 2.

      il suffit d'écrire dans le fichier, ou je n'ai pas pigé la question?

          with open('test', 'w') as r:
             pkts = sniff(prn=lambda x:r.write(x.sprintf("{IP:%IP.src%,%IP.sport%,%IP.dst%,%IP.dport%,%IP.proto%,%IP.time%}")+"\n"))
          r.close()
    • [^] # Re: réponse

      Posté par  . Évalué à 2.

      import sys
      from scapy.all import *
      
      r = open('test', 'w')
      
      print(' pkts = sniff(prn=lambda x:x.sprintf("{IP:%IP.src%,%IP.sport%,%IP.dst%,%IP.dport%,%IP.proto%,%IP.time%}"))', file=f)
      
      r.close()

      Tu as nommé ton descripteur de fichier 'r' :

      r = open('test', 'w')

      c’est donc cet identifiant qu’il faut utiliser pour ton print :

      print(' pkts = sniff(prn=lambda x:x.sprintf("{IP:%IP.src%,%IP.sport%,%IP.dst%,%IP.dport%,%IP.proto%,%IP.time%}"))', file=r)

      Par contre je ne sais pas trop ce que tu essayes d’écrire, je ne connais pas scapy mais je penses qu’il y a un truc que tu fais mal…

      Qu’est censé retourner la fonction sniff ?

  • # réponse [résolu]

    Posté par  . Évalué à 1.

    La fonction sniff de scapy me permet de récuperer les flux qui passent sur mon interface réseau (ici elle ne me retourne que certains élément, ip source, port source, ip destination, port destination, protocole et l'heure a laquelle il est passé)

    J'ai résolu mon problème (je le post si jamais cela peut servir à quelqu'un) :

    import sys
    from scapy.all import *

    old_stdout = sys.stdout
    sys.stdout = open("/chemindufichier",'w')

    pkts = sniff(prn=lambda x:x.sprintf("{IP:%IP.src%,%IP.sport%,%IP.dst%,%IP.dport%,%IP.proto%,%IP.time%}"))

    Avec ceci je récupère bien ma sortie standard (au format csv)

    Merci pour l'aide !

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.