📅  最后修改于: 2023-12-03 15:34:32.380000             🧑  作者: Mango
常常需要获取某个网段内的所有IP地址来进行批量操作,比如端口扫描、ping测试等。本文将介绍如何使用Python来获取指定网段内的所有IP地址。
在介绍获取IP地址的方法之前,我们先来了解一下IP地址的相关知识。
IP地址是Internet上使用的协议地址,用于标识唯一的一个设备。它由32位二进制数表示,在实际使用中通常以“点分十进制”(也就是使用四个10进制数字,每个数字的取值范围是0~255,中间用“.”隔开)的形式表示。
Python中的socket模块提供了获取IP地址的方法,我们可以使用这个模块来获取指定网段内的所有IP地址。
import socket
def get_ip_address(start_ip, end_ip):
ips = []
for ip in range(int(socket.inet_aton(start_ip).hex(), 16), int(socket.inet_aton(end_ip).hex(), 16) + 1):
ips.append(socket.inet_ntoa(hex(ip)[2:].zfill(8).encode('ascii')))
return ips
上面的代码使用了inet_aton
函数将IP地址转换为32位二进制数,然后使用hex
函数将其转换为16进制数,最后使用inet_ntoa
函数将16进制数转换为IP地址的字符串表示。
使用该方法时,需要传入起始IP地址和结束IP地址,函数将返回在这个范围之间的所有IP地址。
Python中的ipaddress
模块也提供了获取IP地址的方法,相较于使用socket模块,该方法代码量更少,更易于阅读。
import ipaddress
def get_ip_address(start_ip, end_ip):
ips = []
ip_range = ipaddress.IPv4Network(f"{start_ip}/{end_ip}", False)
for ip in ip_range:
ips.append(str(ip))
return ips
上面的代码创建了一个IPv4的地址段,然后使用for
循环迭代这个地址段,获取其中的IP地址,并将其添加到一个列表中返回。
使用该方法时,同样需要传入起始IP地址和结束IP地址参数。
下面是一个完整的示例代码,可以直接运行查看效果:
import socket
import ipaddress
def get_ip_address_by_socket(start_ip, end_ip):
ips = []
for ip in range(int(socket.inet_aton(start_ip).hex(), 16), int(socket.inet_aton(end_ip).hex(), 16) + 1):
ips.append(socket.inet_ntoa(hex(ip)[2:].zfill(8).encode('ascii')))
return ips
def get_ip_address_by_ipaddress(start_ip, end_ip):
ips = []
ip_range = ipaddress.IPv4Network(f"{start_ip}/{end_ip}", False)
for ip in ip_range:
ips.append(str(ip))
return ips
if __name__ == '__main__':
start_ip = "192.168.1.1"
end_ip = "192.168.1.10"
ips_by_socket = get_ip_address_by_socket(start_ip, end_ip)
ips_by_ipaddress = get_ip_address_by_ipaddress(start_ip, end_ip)
print(f"IPs by socket module: {ips_by_socket}")
print(f"IPs by ipaddress module: {ips_by_ipaddress}")
本文介绍了两种获取指定网段内的所有IP地址的方法。在实际使用时,我们还需要考虑IP地址的掩码等相关知识,以确保获取到的IP地址是可用的。