14

scapyを使用して情報を収集し、xmlコードを返す小さなスクリプトを作成しています。このコードは、metasploitのxmlrpcインターフェイスに渡されます。スクリプトがxmlのみを返し、追加の警告などを返さないようにしたいと思います。

verbose=0sr1コマンドにオプションを追加することで、ほとんどのscapy出力を抑制できます。すべての出力の前にまだ取得しているものであり、モジュールをロードしているときにこの警告が返されると思います。

警告:IPv6宛先のルートが見つかりません::(デフォルトルートがありませんか?)

次のようにスクリプトを呼び出すことで、その出力を簡単にリダイレクトできます。

 ./myscript 2> /dev/null

しかし、これをスクリプトに組み込みたいと思います。sys.stderrそのために、何も書き込まないNullDeviceクラスを作成し、そのNullDeviceクラスのインスタンス化に設定するというヒントを見つけました。

これは残念ながら、モジュールをロードした後でのみ機能するため、警告が表示され、stderrに送信された後続のメッセージのみがリダイレクトされます。

その警告メッセージが画面に表示されないようにするにはどうすればよいですか?

4

4 に答える 4

33

次を追加することで、scapyによる警告を取り除くことができます。

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

Scapyをインポートする前に。これにより、エラーメッセージよりも重大度が低いすべてのメッセージが抑制されます。


例えば:

import logging
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
from scapy.all import *
...
于 2012-11-06T10:52:17.573 に答える
2

これが正しい方法だと思います。

>>> 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
>>> 
于 2017-06-29T14:49:14.370 に答える
0

おそらく、python3バージョンのscapyは、別のロガーからのメッセージまたは高レベルのメッセージを出力すると思います。モジュールのインポート時に出力を抑制するために使用したコードを次に示します。

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
于 2015-06-09T13:14:25.850 に答える
0

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
于 2017-10-24T11:41:51.450 に答える