Scapyを使用していくつかの情報を収集し、いくつかのxmlコードを返す小さなスクリプトを作成しています。このスクリプトは、metasploitのxmlrpcインターフェイスに渡されます。スクリプトがxmlのみを返し、追加の警告などを返さないようにしたいと思います。
オプションverbose=0
をsr1コマンドに追加することで、ほとんどのscapy出力を抑制することができます。すべての出力の前にまだ取得しているもので、モジュールをロードしているときにこの警告が返されると思います。
警告:IPv6宛先のルートが見つかりません::(デフォルトルートがありませんか?)
次のようにスクリプトを呼び出すことで、その出力を簡単にリダイレクトできます。
./myscript 2> /dev/null
しかし、これをスクリプトに組み込みたいと思います。そのために、何も書き込まないNullDeviceクラスを作成し、sys.stderr
をそのNullDeviceクラスのインスタンス化に設定するというヒントを見つけました。
残念ながら、これはモジュールをロードした後でのみ機能するため、警告が表示され、stderrに送信された後続のメッセージのみがリダイレクトされます。
その警告メッセージが画面に表示されないようにするにはどうすればよいですか?
次を追加することで、scapyによる警告を取り除くことができます。
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
前 Scapyをインポートしています。これにより、エラーメッセージよりも重大度が低いすべてのメッセージが抑制されます。
例:
import logging
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
from scapy.all import *
...
これが正しい方法だと思います。
>>> 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
>>>
おそらく、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
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