2012-11-06 14 views
10

Ich schreibe ein kleines Skript, das einige Informationen mit Hilfe von Scapy sammelt und dann einen XML-Code zurückgibt, den ich an die xmlrpc-Schnittstelle von metasploit weitergeben werde. Ich würde es mögen, dass mein Skript nur xml, und keine zusätzlichen Warnungen usw. zurückgibt.Surpress Scapy Warnmeldung beim Importieren des Moduls

Ich kann den meisten scapy Ausgang untersetzen, indem ich die Option verbose=0 meinem sr1 Befehl hinzufüge. Was ich vor jeder Ausgabe immer noch, und ich nehme an, es diese Warnung zurück, wenn ich das Modul bin Laden, ist:

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

ich einfach, dass die Ausgabe umleiten kann, durch mein Skript wie folgt aufrufen:

./myscript 2> /dev/null 

aber ich möchte das in das Skript integrieren. Dafür habe ich einen Hinweis gefunden, dass man eine NullDevice-Klasse haben könnte, die nichts schreibt und dann sys.stderr auf eine Instanz dieser NullDevice-Klasse setzt.

Dies funktioniert leider nur, nachdem ich das Modul bereits geladen habe, also habe ich immer noch die Warnung, und es leitet nur alle folgenden Nachrichten um, die an stderr gesendet werden.

Wie kann ich diese Warnmeldung auf meinem Bildschirm erscheinen lassen?

Antwort

28

Sie können durch Hinzufügen von scapy von Warnungen loszuwerden:

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

vor Import scapy. Dadurch werden alle Nachrichten unterdrückt, die eine geringere Seriosität aufweisen als Fehlermeldungen.


zum Beispiel:

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

Ich denke, vielleicht die python3 Version von scapy druckt eine Nachricht von einem anderen Logger oder auf einem hohen Niveau. Hier ist ein Code, mit dem ich die Ausgabe beim Modulimport unterdrückt habe.

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

Ich denke, das ist der richtige Weg.

>>> 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

Mit Python3, redefining sys.stderr to None hat eine Ausnahme Attribute: 'NoneType' Objekt kein Attribut 'write' hat. Anstatt es zu os.devnull zu definieren, macht es den Job:

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

scapy ist nicht python3 kompatibel. Sie benötigen scapy3k – user857990

+0

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