подавить предупреждающее сообщение scapy при импорте модуля

Я пишу небольшой скрипт, который собирает некоторую информацию с помощью scapy, а затем возвращает некоторый код xml, который я передам в интерфейс xmlrpc metasploit. Я бы хотел, чтобы мой скрипт возвращал только xml, без дополнительных предупреждений и т. д.

Я могу подавить большинство выводов scapy, добавив параметр verbose=0 к моей команде sr1. То, что я все еще получаю перед каждым выводом, и я предполагаю, что оно возвращает это предупреждение при загрузке модуля, это:

ВНИМАНИЕ: Маршрут для пункта назначения IPv6 не найден :: (нет маршрута по умолчанию?)

Я могу легко перенаправить этот вывод, вызвав свой скрипт следующим образом:

 ./myscript 2> /dev/null

но я хотел бы включить это в сценарий. Для этого я нашел подсказку, что можно иметь класс NullDevice, который ничего не пишет, а затем установить sys.stderr в экземпляр этого класса NullDevice.

К сожалению, это работает только после того, как я уже загрузил модуль, поэтому у меня все еще есть предупреждение, и оно только перенаправляет любые последующие сообщения, отправленные на стандартный вывод.

Как я могу подавить появление этого предупреждающего сообщения на моем экране?


person user857990    schedule 06.11.2012    source источник


Ответы (4)


Вы можете избавиться от предупреждений с помощью scapy, добавив:

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

до импорта Scapy. При этом будут подавлены все сообщения с более низким уровнем серьезности, чем сообщения об ошибках.


например:

import logging
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
from scapy.all import *
...
person halex    schedule 06.11.2012

Я думаю, что это правильный путь.

>>> 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
>>> 
person Joel Maatkamp    schedule 29.06.2017

Я думаю, что, возможно, версия 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
person mkingston    schedule 09.06.2015

В Python3 переопределение sys.stderr на None вызвало исключение AttributeError: объект 'NoneType' не имеет атрибута 'write '. Вместо этого определение его как os.devnull делает работу:

import os
import sys
sys.stderr = os.devnull # suppress stderr
from scapy.all import *
sys.stderr = sys.__stderr__ # restore stderr
person Juuso Ohtonen    schedule 24.10.2017
comment
scapy не совместим с python3. вам нужен scapy3k - person user857990; 24.10.2017