📜  python获取范围内的所有ip - Python(1)

📅  最后修改于: 2023-12-03 15:34:32.380000             🧑  作者: Mango

Python获取范围内的所有IP

常常需要获取某个网段内的所有IP地址来进行批量操作,比如端口扫描、ping测试等。本文将介绍如何使用Python来获取指定网段内的所有IP地址。

IP地址相关知识

在介绍获取IP地址的方法之前,我们先来了解一下IP地址的相关知识。

IP地址是Internet上使用的协议地址,用于标识唯一的一个设备。它由32位二进制数表示,在实际使用中通常以“点分十进制”(也就是使用四个10进制数字,每个数字的取值范围是0~255,中间用“.”隔开)的形式表示。

获取IP地址的方法
方法一:使用socket模块

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地址。

方法二:使用ipaddress模块

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地址是可用的。