如何使用ipaddress模块在Python中操作IP地址?

2021年11月16日20:40:22 发表评论 1,020 次浏览

Python如何操作IP地址?使用 ipaddress 标准 Python 库来操作 IPv4 和 IPv6 地址、网络、子网等。

Python ipaddress如何操作IP地址?在本教程中,您将学习如何使用ipaddress模块使用IP地址在Python中,网络工程师和开发网络相关软件的人经常使用此模块,它提供了方便的函数和类,处理各种任务相关的IP地址,包括检查两个主机是否属于同一子网,迭代一个子网的所有主机,检索特定子网的广播地址,等等。

相关:如何在 Python 中使用 Scapy 制作网络扫描仪。

Python ipaddress操作IP地址示例介绍 - 我们不需要安装任何东西,因为这个模块是内置的,它是在 Python 3.3 中引入的,所以如果你有 Python 3.3+(我相信你有),你很高兴!

让我们从IPv4Address类开始:

import ipaddress
# initialize an IPv4 Address
ip = ipaddress.IPv4Address("192.168.1.1")

现在,这个ip对象代表单个 IP 地址,我们可以检查它是否是全局 IP 地址(非私有)以及它是否是本地链接

# print True if the IP address is global
print("Is global:", ip.is_global)

# print Ture if the IP address is Link-local
print("Is link-local:", ip.is_link_local)

输出:

Is global: False
Is link-local: False

你也可以使用ip.is_reserved和ip.is_multicast分别检查该 IP 地址是否在保留 IP 和多播地址列表中。

你可以对 IP 地址进行加减运算:

# next ip address
print(ip + 1)

# previous ip address
print(ip - 1)

Python ipaddress如何操作IP地址?你猜对了,IP加1表示下一个IP地址,减1表示上一个IP地址,输出如下:

192.168.1.2
192.168.1.0

由于我无法涵盖所有​​可用的方法,因此编写dir(ip)以发现你可以使用的各种方法和属性。

现在你对IPv4Address对象有了基本的了解,让我们深入处理IPv4Network对象:

# initialize an IPv4 Network
network = ipaddress.IPv4Network("192.168.1.0/24")

现在这个网络对象代表一个 IPv4 网络,/24 的东西是CIDR 表示法,它表示IP 地址总共32位的前导24位用于标识地址的网络部分,这意味着在这种情况下,“ 192.168.1.x"是网络部分(3x8 = 24位),只有最后一个八位字节“xxx0”是主机部分。

你可以检索此网络的网络掩码:

# get the network mask
print("Network mask:", network.netmask)

输出:

Network mask: 255.255.255.0

Python ipaddress操作IP地址示例:网络掩码只是用于表达和表示地址的网络部分的另一种格式(可能较旧),在这种情况下,255.255.255.0表示前24位填充为1(255是11111111二进制)表示地址的网络部分(与/24表示法相同)。

以下是获取网络广播地址的方法:

# get the broadcast address
print("Broadcast address:", network.broadcast_address)

输出:

Broadcast address: 192.168.1.255

复制打印属于这个网络的主机数:

# print the number of IP addresses under this network
print("Number of hosts under", str(network), ":", network.num_addresses)

输出:

Number of hosts under 192.168.1.0/24 : 256

该网络下共有256 个主机(包括子网和广播地址)可用,以下是你可以迭代所有主机的方法:

# iterate over all the hosts under this network
print("Hosts under", str(network), ":")
for host in network.hosts():
    print(host)

这将打印范围从192.168.1.1到192.168.1.254 的所有有效主机 IP 地址。

你还可以获取此网络的子网

# iterate over the subnets of this network
print("Subnets:")
for subnet in network.subnets(prefixlen_diff=2):
    print(subnet)

输出:

Subnets:
192.168.1.0/26
192.168.1.64/26
192.168.1.128/26
192.168.1.192/26

Python ipaddress如何操作IP地址?network.subnets()方法返回加入使当前子网作为IPv4Network对象列表的子网,prefixlen_diff参数是一个整数,表示前缀长度应增加的量,我将其设置为2,这样我就可以获得/26子网。

你还可以获得超网

# get the supernet of this network
print("Supernet:", network.supernet(prefixlen_diff=1))

这将返回包含当前网络的超网,这是输出:

Supernet: 192.168.0.0/23

Python ipaddress操作IP地址示例 - 复制最后,你可以测试一个网络是否与另一个网络重叠:

# tell if this network is under (or overlaps) 192.168.0.0/16
print("Overlaps 192.168.0.0/16:", network.overlaps(ipaddress.IPv4Network("192.168.0.0/16")))

输出:

Overlaps 192.168.0.0/16: True

它返回True,因为192.168.1.1/24子网在192.168.0.0/16网络下。

Python如何操作IP地址?好的,我们已经完成了本教程,你可以通过查看他们的官方文档来探索这个模块,以获取更多 IPv4 的函数和类以及对于希望开发网络应用程序的网络工程师和 Python 程序员来说非常方便的 IPv6 地址。

木子山

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: