2012-11-06 37 views
10

Tôi đang viết một tập lệnh nhỏ, tập hợp một số thông tin bằng scapy và sau đó trả về một số mã xml, tôi sẽ chuyển sang giao diện xmlrpc của metasploit. Tôi muốn rằng tập lệnh của tôi chỉ trả lại xml và không có cảnh báo bổ sung, v.v.Thông báo cảnh báo scapy nhấn khi nhập mô-đun

Tôi có thể nhấn mạnh hầu hết các đầu ra bằng scapy, và thêm tùy chọn verbose=0 vào lệnh sr1 của tôi. Những gì tôi vẫn nhận được trước mỗi đầu ra, và tôi giả định nó sẽ trả về cảnh báo này khi tôi đang tải các module, là:

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

tôi có thể dễ dàng chuyển hướng đầu ra rằng, bằng cách gọi kịch bản của tôi như thế này:

./myscript 2> /dev/null 

nhưng tôi muốn kết hợp điều này vào tập lệnh. Cho rằng tôi đã tìm thấy một gợi ý, rằng người ta có thể có một lớp NullDevice, mà không viết bất cứ điều gì, và sau đó thiết lập sys.stderr để một instantiation của lớp NullDevice.

Điều này chỉ hoạt động không may sau khi tôi đã tải mô-đun, vì vậy tôi vẫn có Cảnh báo và nó chỉ chuyển hướng bất kỳ tin nhắn nào sau đây được gửi tới stderr.

Làm cách nào để có thể nhấn mạnh thông báo cảnh báo đó xuất hiện trên màn hình của tôi?

Trả lời

28

Bạn có thể thoát khỏi cảnh báo bởi scapy bằng cách thêm:

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

trước nhập khẩu Scapy. Điều này sẽ ngăn chặn tất cả các thư có mức độ nghiêm trọng thấp hơn các thông báo lỗi.


ví dụ:

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

Tôi nghĩ rằng có lẽ là phiên bản python3 của scapy in một tin nhắn từ một logger khác nhau hoặc ở mức cao. Dưới đây là một số mã tôi đã sử dụng để ngăn chặn đầu ra trên nhập khẩu mô-đun.

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

Tôi nghĩ đây là cách chính xác.

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

Với Python3, redefining sys.stderr to None ném một ngoại lệ AttributeError : đối tượng 'NoneType' không có thuộc tính 'ghi'. Thay vào đó, hãy xác định nó là os.devnull sẽ thực hiện công việc:

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

scapy không tương thích với python3. bạn cần scapy3k – user857990

+0

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

Các vấn đề liên quan