2012-11-06 16 views
10

Sto scrivendo un piccolo script, che raccoglie alcune informazioni utilizzando scapy e quindi restituisce un codice xml, che passerò all'interfaccia xmlrpc di metasploit. Mi piacerebbe che il mio script restituisse solo xml e nessun avviso aggiuntivo ecc.messaggio di avvertimento surpress scapy durante l'importazione del modulo

Posso sopprimere la maggior parte dell'output di scapy, con l'aggiunta dell'opzione verbose=0 al mio comando sr1. Quello che ho ancora prima di ogni uscita, e presumo restituisce questo avvertimento quando sto caricamento del modulo, è:

WARNING: No route found for IPv6 destination :: (no default route?) 

posso facilmente reindirizzare che la produzione, chiamando il mio script come questo:

./myscript 2> /dev/null 

ma vorrei incorporarlo nella sceneggiatura. Per questo ho trovato un suggerimento, che si potrebbe avere una classe NullDevice, che non scrive nulla, e quindi impostare sys.stderr per un'istanza di quella classe NullDevice.

Questo funziona purtroppo solo dopo aver già caricato il modulo, quindi ho ancora l'avviso, e reindirizza solo i seguenti messaggi inviati a stderr.

Come posso sopprimere tale messaggio di avviso per apparire sullo schermo?

risposta

28

È possibile liberarsi di avvertimenti Scapy aggiungendo:

logging.getLogger("scapy.runtime").setLevel(logging.ERROR) 

prima importare Scapy. Questo sopprimerà tutti i messaggi con un livello di gravità inferiore rispetto ai messaggi di errore.


ad esempio:

import logging 
logging.getLogger("scapy.runtime").setLevel(logging.ERROR) 
from scapy.all import * 
... 
0

Penso che forse la versione python3 di Scapy stampa un messaggio da un registratore diverso o ad un livello elevato. Ecco un codice che ho usato per sopprimere l'output sull'importazione del modulo.

from contextlib import contextmanager 

# It looks like redirect_stderr will be part of Python 3.5 as follows: 
# from contextlib import redirect_stderr 
# Perhaps if you're looking at this code and 3.5 is out, this function could be 
# removed. 
@contextmanager 
def redirect_stderr(new_target): 
    """ 
    A context manager to temporarily redirect stderr. Example use: 
    with open(os.devnull, 'w') as f: 
     with redirect_stderr(f): 
      # stderr redirected to os.devnull. No annoying import messages 
      # printed on module import 
      from scapy.all import * 
    # stderr restored 
    """ 
    import sys 
    old_target, sys.stderr = sys.stderr, new_target # replace sys.stdout 
    try: 
     yield new_target # run some code with the replaced stdout 
    finally: 
     sys.stderr = old_target # restore to the previous value 


# Don't print the annoying warning message that occurs on import 
with open(os.devnull, 'w') as errf: 
    with redirect_stderr(errf): 
     from scapy.all import sr, ICMP, IP, traceroute 
1

Penso che questo sia il modo corretto.

>>> import sys 
>>> sys.stderr = None   # suppress stderr 
>>> from scapy.all import * 
>>> sys.stderr = sys.__stderr__ # restore stderr 
>>> print("other errors can be shown", file=sys.stderr) 
other errors can be shown 
>>> 
0

Con python3, redefining sys.stderr to None gettato un AttributeError eccezione : oggetto 'NoneType' non ha un attributo 'scrittura'. Invece, definendolo a os.devnull fa il lavoro:

import os 
import sys 
sys.stderr = os.devnull # suppress stderr 
from scapy.all import * 
sys.stderr = sys.__stderr__ # restore stderr 
+0

Scapy non è python3 compatibili. hai bisogno di scapy3k – user857990

+0

https://github.com/phaethon/scapy – user857990