导入模块时禁止scapy警告消息

时间:2012-11-06 10:45:44

标签: python hide stderr scapy output

我正在编写一个小脚本,使用scapy收集一些信息,然后返回一些xml代码,我将传递给metasploit的xmlrpc接口。我希望我的脚本只返回xml,没有其他警告等。

我可以通过在我的sr1命令中添加选项verbose=0来抑制大多数scapy输出。我在每个输出之前仍然得到的,并且我假设它在我加载模块时返回此警告,是:

  

警告:找不到IPv6目的地的路由::(没有默认路由?)

我可以通过调用我的脚本轻松重定向该输出:

 ./myscript 2> /dev/null

但我想把它合并到脚本中。为此,我找到了一个提示,一个可以有一个NullDevice类,它不会写任何东西,然后将sys.stderr设置为该NullDevice类的实例化。

只有在我已经加载模块之后才会这样做,所以我仍然有警告,它只会重定向发送给stderr的任何后续消息。

如何禁止在屏幕上显示该警告消息?

4 个答案:

答案 0 :(得分:30)

你可以通过添加:

来消除scapy的警告
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
在导入Scapy之前

。这将禁止所有严重程度低于错误消息的消息。


例如:

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

答案 1 :(得分: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
>>> 

答案 2 :(得分: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

答案 3 :(得分:0)

使用Python3,redefining sys.stderr to 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