Python的ipaddress子產品專門設計用于處理不同類型的IP位址,并具有許多功能。可以使用此子產品中的函數在Python程式中建立、操作、修改IP位址。ipaddress子產品提供了許多功能,可以用來處理與IP位址相關的各種任務。例如,檢查兩個主機是否在同一子網内、疊代所有主機等。你可以使用ipaddress子產品檢查IP位址是IPv4還是IPv6、識别IP網絡上的主機、識别網絡的廣播位址、識别IP網絡重疊、在IP網絡上建立子網和超網等。此外,ipaddress子產品還提供了許多其他功能,可以幫助你更好地管理和操作IP位址。如果你想了解更多關于ipaddress子產品的資訊,可以檢視官方文檔。最後,需要特别說明的是ipaddress子產品是python的内置子產品,無需安裝就可以直接使用。
本文介紹如何使用python ipaddress子產品來實作工作中遇到的一個小任務,這個任務的目的是随機生成ip位址,但是随機生成的ip需要從所有限制條件限定的ip範圍内随機選擇。
單個限制條件支援如下三種形式:
- ip位址,格式為x.x.x.x
- ip區間,格式為x.x.x.x-x.x.x.x
- ip網段,格式為x.x.x.x/m
在開始具體任務之前,先來熟悉一下會使用到的ipaddress子產品的幾個基本方法,其實也就是ip_address、ip_network兩個方法而已。
ip_address方法
ip_address方法接受整數或ip形式的字元串作為參數,生成IPv4Address對象
>>> import ipaddress
>>> ip=ipaddress.ip_address(3232236291)
>>> ip
IPv4Address('192.168.3.3')
>>> ip=ipaddress.ip_address("192.168.3.3")
>>> ip
IPv4Address('192.168.3.3')
ip_network方法
ip_network方法接受ip網段形式的字元串作為參數,生成IPv4Address對象
>>> ip=ipaddress.ip_network("192.168.3.0/255.255.255.0")
>>> ip
IPv4Network('192.168.3.0/24')
>>> ip=ipaddress.ip_network("192.168.3.0/26")
>>> ip
IPv4Network('192.168.3.0/26')
IPv4Address對象轉換
上面兩個方法都生成了IPv4Address對象,可以使用str方法将其轉換為ip位址的字元串形式,int方法将其轉換為整數形式
>>> ip=ipaddress.ip_address(3232236291)
>>> ip
IPv4Address('192.168.3.3')
>>> str(ip)
'192.168.3.3'
>>> int(ip)
3232236291
生成随機ip
利用上面幾個方法可以輕松解決這個随機生成ip的任務,參考代碼如下,關鍵部分已添加注釋
import random
import ipaddress
def random_ipv4(seeds):
"""從清單seeds中随機生成一個ipv4位址并傳回,要求如下:
1. seeds清單中的值可以為ip位址、ip區間(A.B.C.D-A.B.C.D)、ip+掩碼格式(A.B.C.D/M)。
2. 生成的随機ip位址必須滿足seeds中表示的ip範圍内選擇。
"""
ipinfo = random.choice(seeds)
if "-" in ipinfo:
# IP區間 A.B.C.D-A.B.C.D
ip_start, ip_end = ipinfo.split("-")
# ip區間最小值
ip_min = int(ipaddress.ip_address(ip_start))
# ip區間最大值
ip_max = int(ipaddress.ip_address(ip_end))
return str(ipaddress.ip_address(random.randint(ip_min, ip_max)))
elif "/" in ipinfo:
# IP掩碼 A.B.C.D/M
return str(random.choice(list(ipaddress.ip_network(ipinfo))))
else:
# IP
return ipinfo
if __name__ == "__main__":
# 生成随機ip的限制條件
ip_seeds = [
"192.168.19.12",
"222.246.135.192/26",
"202.103.64.0-202.103.127.255"
]
ip = random_ipv4(ip_seeds)
print(ip)