2012-11-06 10 views
10

scapyを使用して情報を収集した後、metasploitのxmlrpcインターフェイスに渡すxmlコードを返す小さなスクリプトを作成しています。私のスクリプトはxmlを返すだけで、警告などは追加しません。モジュールをインポートするときにscapy警告メッセージを表示しない

私はsr1コマンドにオプションverbose=0を追加することで、ほとんどのscapy出力を抑えることができます。私はまだすべての出力の前に取得し、私は、私はモジュールをロードしていたときに、それはこの警告を返すと仮定すると、次のとおりです。

./myscript 2> /dev/null 
:私は簡単にこのような私のスクリプトを呼び出すことで、その出力をリダイレクトすることができ

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

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

これは残念なことに私が既にモジュールをロードした後でしか動作しませんので、警告が表示され、次のメッセージは標準エラー出力に送られます。

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

答えて

28

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

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

がScapyをインポートする前に。これにより、エラーメッセージより深刻度の低いすべてのメッセージが表示されなくなります。例えば


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

Iは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 
1

これは正しい方法だと思います。 python3で

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

redefining sys.stderr to Noneは例外はAttributeErrorを投げた: 'NoneType' オブジェクトが属性 '書き込み'を持っていません。代わりに、os.devnullに定義すると、ジョブは実行されます。

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

scapyはpython3と互換性がありません。 scapy3kが必要 – user857990

+0

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

関連する問題