天天看點

使用python ipaddress子產品随機生成ip

作者:一點鑫得

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)