パケットをスニッフィングするときの scapy のタイムアウト オプションに問題があります。私が理解していることから、次のようなものを使用すると:
test = sniff(filter="ip and icmp ", timeout = 2)
print(test)
スニッフィングは 2 秒後にタイムアウトするはずです。ただし、これは 100% 機能しません。私が収集したものから、最大の問題の 1 つは、タイムアウト = 5 を設定してスニファーを実行し、次に並列コマンド プロンプトで ping google.com を実行すると、スニファーが検出されるまで表示されない4 つのパケットがキャプチャされることです。完了したら、あと 1 つの icmp パケットを 1 つだけ送信または受信するまで、無期限にそこに座ってから、スニフを強制終了し、最初の ping セットから合計 5 つの icmp 4、2 番目の ping から 1で印刷 (テスト) します。
私はWindowsを使用していますが、それは私が知らない問題かもしれません。私はpython 2.7を持っています。私のスクリプト全体は、この 1 つのことをテストするために、はるかに大きなスクリプトから分離する必要がありました。
from scapy.all import *
test = sniff(filter="ip and icmp ", timeout = 5)
print(test)
それだけです - タイムアウト = 1 の場合、パケットが受信されるまで停止しません。
これは、スニッフ タイムアウト用の scapy の sendrecv.py のコードです。
if timeout is not None:
stoptime = time.time()+timeout
remain = None
while 1:
try:
if timeout is not None:
remain = stoptime-time.time()
if remain <= 0:
break
scapy sendrecv.py から関数をリッピングし、関数に同じ問題があることに気付いた後、問題を絞り込みました。フィルターをスニフ関数に渡すと、タイムアウトの動作方法が変更されます。あなたが実行した場合:
scapy.allインポートから *
test = sniff(timeout = 5)
print(test)
5 秒で自動的にタイムアウトします。それ以外の場合はハングし、タイムアウト ループを適切に完了しません。