1. ホーム
  2. python

[解決済み] Pythonでipがネットワークにあるかどうかを確認するには?

2022-08-15 06:45:51

質問

あるIPアドレス(例えば192.168.0.1)が与えられたとき、それがネットワーク(例えば192.168.0.0/24)内にあるかどうかをPythonで確認するにはどうすればよいですか。

ipアドレス操作のためのPythonの一般的なツールはありますか?ホストルックアップ、int型へのipアドレス、int型へのネットマスク付きネットワークアドレスなどのようなものですか?2.5 の標準の Python ライブラリであることを望みます。

どのように解決するのですか?

この記事 でできることを示しています。 socket struct のモジュールを、あまり余分な労力をかけずに作成することができます。 以下のように、記事に少し書き加えました。

import socket,struct

def makeMask(n):
    "return a mask of n bits as a long integer"
    return (2L<<n-1) - 1

def dottedQuadToNum(ip):
    "convert decimal dotted quad string to long integer"
    return struct.unpack('L',socket.inet_aton(ip))[0]

def networkMask(ip,bits):
    "Convert a network address to a long integer" 
    return dottedQuadToNum(ip) & makeMask(bits)

def addressInNetwork(ip,net):
   "Is an address in a network"
   return ip & net == net

address = dottedQuadToNum("192.168.1.1")
networka = networkMask("10.0.0.0",24)
networkb = networkMask("192.168.0.0",24)
print (address,networka,networkb)
print addressInNetwork(address,networka)
print addressInNetwork(address,networkb)

これは出力されます。

False
True

もし、文字列を受け取る関数を1つだけ作りたい場合は、次のようになります。

import socket,struct

def addressInNetwork(ip,net):
   "Is an address in a network"
   ipaddr = struct.unpack('L',socket.inet_aton(ip))[0]
   netaddr,bits = net.split('/')
   netmask = struct.unpack('L',socket.inet_aton(netaddr))[0] & ((2L<<int(bits)-1) - 1)
   return ipaddr & netmask == netmask