2012-11-06 50 views
10

मैं एक छोटी लिपि लिख रहा हूं, जो स्कैपी का उपयोग करके कुछ जानकारी एकत्र करता है और फिर कुछ एक्सएमएल कोड देता है, जो मैं मेटास्पलोइट के xmlrpc इंटरफ़ेस पर जाता हूं। मुझे यह अच्छा लगेगा कि मेरी स्क्रिप्ट केवल एक्सएमएल लौटाती है, और कोई अतिरिक्त चेतावनी इत्यादि नहीं।मॉड्यूल आयात करते समय सरपस स्कैपी चेतावनी संदेश

मैं अपने sr1 कमांड में verbose=0 विकल्प जोड़ने के साथ सबसे अधिक स्कैपी आउटपुट को दबा सकता हूं। क्या मैं अभी भी हर उत्पादन से पहले मिलता है, और मैं इसे इस चेतावनी देता है जब मैं मॉड्यूल लोड हो रहा है कर रहा हूँ मान, है:

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

मैं आसानी से, कि उत्पादन अनुप्रेषित कर सकते हैं इस तरह मेरी स्क्रिप्ट को फोन करके:

./myscript 2> /dev/null 

लेकिन मैं इसे स्क्रिप्ट में शामिल करना चाहता हूं। इसके लिए मुझे एक संकेत मिला है, जिसमें कोई नलडिवाइस क्लास हो सकता है, जो कुछ भी नहीं लिखता है, और फिर उस नलडिवाइस क्लास के तत्कालता के लिए sys.stderr सेट करता है।

दुर्भाग्य से मॉड्यूल को लोड करने के बाद यह दुर्भाग्य से काम करता है, इसलिए मेरे पास अभी भी चेतावनी है, और यह केवल stderr को भेजे गए किसी भी संदेश को रीडायरेक्ट करता है।

मैं अपनी स्क्रीन पर उस चेतावनी संदेश को कैसे प्रदर्शित कर सकता हूं?

उत्तर

28

आप Scapy द्वारा चेतावनी से छुटकारा पा सकते जोड़कर:

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

से पहले Scapy का आयात। यह उन सभी संदेशों को दबाने देगा जिनमें त्रुटि संदेशों की तुलना में गंभीरता का निम्न स्तर है।


उदाहरण के लिए :

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

मैं शायद Scapy की python3 संस्करण एक अलग लकड़हारा से या एक उच्च स्तर पर संदेश प्रिंट लगता है। यहां कुछ कोड है जिसका उपयोग मैंने मॉड्यूल आयात पर आउटपुट को दबाने के लिए किया है।

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

मुझे लगता है कि यह सही तरीका है।

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

python3, redefining sys.stderr to None के साथ फेंक दिया एक अपवाद AttributeError: 'NoneType' ऑब्जेक्ट कोई विशेषता 'लिखने' है। इसके बजाय, इसे os.devnull पर परिभाषित करना नौकरी करता है:

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

स्कैपी python3 संगत नहीं है। आपको scapy3k – user857990

+0

https://github.com/phaethon/scapy की आवश्यकता है – user857990