2017-12-04 19 views
4

私は全く新しいscapyを使用しています。私はこれを使用して私のLANのDHCPモニタを構築しようとしています。私はprn=パラメータを介してコールバックに送信されるパケットをキャプチャするためにsniffを使用しています。コールバックの中で、パケットにDHCPのレイヤーがあるかどうかを確認してから、要求のタイプをチェックします。Scapy:キャプチャされたDHCPパケットのメッセージタイプを確認してください

私は現在、このようにそれをやっている:私はDHCP層にoptionsにアクセスしてい

def manage(pkt): 
    if pkt.haslayer(DHCP): 
     req_type = [x[1] for x in pkt[DHCP].options if x[0] == 'message-type'][0] 

     # Message type: request 
     if req_type == 3: 
      print ("Request from {}".format(pkt[Ether].src)) 

sniff(prn=manage, count=0, store=0) 

方法は、一種の厄介ですが、それは私がその作品を作ってみただけです。しかし、私は、dictまたは何かを介してより良い、よりpythonic方法がなければならないと信じています。

これらのオプションにはどのような方法でアクセスできますか?

+1

これに役立つ回答があるのが不思議です。私は、あなたが今やっていることよりも、もっと「組織化された」ものは何かしているとは言えません。問題は、DHCPがbootpペイロードにオプションのリストを投げることだけです。特別なオプションは必要なく、特別な注文は必要ありません。同じタイプの複数のオプション(ルータ、DNSサーバなど)を持つことが可能です。したがって、動作する明らかなdictタイプのフレームワークはありません。複数のメッセージタイプを持つことは実際には意味がありません。そして、しばしば最初になるだろうが、何もないとは言いません。 –

答えて

1

私はこれがあなたが望むことを実行する最も効率的な方法だと思います。私はnext()使用するとジェネレータ式ではなく、リストには、それが必要ないとき、全体のオプションのリストを解析避けるために:いくつかがそうであるように、私もoptのタイプに対するチェックを追加しました

req_type = next(opt[1] for opt in pkt[DHCP].options if isinstance(opt, tuple) and opt[0] == 'message-type') 

注意文字列オブジェクト。

dict()を使用できますが、オプションリスト全体を解析することもできます。

補足として、ScapyでDHCPオプションを処理する方法は少し古いですが、これを行う正しい方法は、おそらく、よりクリーンな方法でPacketListFieldを使用してオプションにアクセスすることでしょう。

+0

'next'を使いこなす。私はそれで解決します。 –

関連する問題