2016-10-21 11 views
0

私はip範囲(すなわちx.y.z.0/24)をスキャンしてオンラインホストのリストを返すpythonプロジェクトを作成しました。これは、オンラインホストリストをIPアドレスだけで保存します(つまり、['192.168.0.1'、 '192.168.0.2'、 '192.168.0.8'、...])私はこの次のステップに問題があります。このオンラインホストリストをIP範囲と比較して、他のデバイスを排除するためのコンピュータであることを確認してください。ここでIPリストを別のIPリストまたはIP範囲と比較する

+0

IPはそのビットマスク内にあるかどうかを確認、ビットマスクするiprangeを変換し、int型にIPSを変換提案されています。 –

+0

例を参考にしていただければ幸いです。 – Ryan

答えて

0

はあなたが試すことができます解決策(それが少し肥大化しているが、私は後でうまくいけば、それを編集します)

def get_range(str_num): 
    """ Converts string representation of number or range into (min,max) tuple """ 
    try: 
     num = int(str_num) 
     return num, num 
    except ValueError: 
     min_, max_ = str_num.split('-') 
     return int(min_), int(max_) 

def host_in_range(host, host_range): 
    """ Checks whether given host belongs to given range (both are range representation """ 
    #print(*zip(host, host_range)) 
    for (min_h, max_h), (min_r, max_r) in zip(host, host_range): 
     if (min_h < min_r) or (max_h > max_r): return False 
    return True 


if __name__ == "__main__": 

    hosts_str = ['192.168.0.1', '192.168.0.10', '0.168.0.0', '192.168.1.10', '192.168.0.255'] 
    hosts = [x.split('.') for x in hosts_str] 
    hosts = [[get_range(x) for x in elem] for elem in hosts] 

    host_ranges_str = ['0-255.168.0.0-254', '192.168.2-5.0-255'] 
    host_ranges = [x.split('.') for x in host_ranges_str] 
    host_ranges = [[get_range(x) for x in elem] for elem in host_ranges] 

    for x in range(5): 
     print(hosts_str[x], "in range", host_ranges_str[0], host_in_range(hosts[x], host_ranges[0])) 
+0

ありがとうございます情報これを試して、何が起こるか見てみましょう。 IP文字列をINTに変換し、ipaddressモジュール内に戻す簡単な方法を見つけました。これにより、静的に比較がかなり簡単になりますが、作成しているプログラムはユーザーの入力に基づいて可変です。 int(ipaddress.IPv4Address( '192.168.0.1')) str(ipaddress.IPv4Address(3232235521)) – Ryan

関連する問題