Python实现扫描局域网活动ip(扫描在线电脑)攻略
一、实现原理
我们可以通过ping指令或UDP广播的方式来探测局域网内的主机,若存在回复则代表主机在线,反之则不在线。具体实现上我们可以使用Python编写脚本,通过Python的socket库来实现基于UDP协议的主机广播扫描,或使用Python内置的subprocess库来调用系统命令执行ping操作。
二、代码实现
1. UDP广播扫描
我们可以使用Python的socket库来实现UDP广播扫描,示例代码如下:
import socket
def broadcast_scan(ip_prefix, port):
"""
UDP广播扫描在线主机
"""
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
udp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
udp_socket.bind(("", port))
online_ips = []
for i in range(1, 255):
address = ip_prefix + str(i)
udp_socket.sendto("ping".encode("utf-8"), (address, port))
udp_socket.settimeout(0.1)
try:
data, addr = udp_socket.recvfrom(1024)
if addr[0] not in online_ips:
online_ips.append(addr[0])
print("IP地址为 %s 的主机在线!" % addr[0])
except socket.timeout:
pass
udp_socket.close()
return online_ips
if __name__ == '__main__':
ip_prefix = "192.168.1."
port = 8080
online_ips = broadcast_scan(ip_prefix, port)
print("在线主机数量为: %d" % len(online_ips))
在上述代码中,我们使用了Python的socket库实现了UDP广播扫描的功能。具体流程如下:
-
创建一个UDP socket对象,并将其设置为广播模式(设置SO_BROADCAST标志位为1);
-
绑定端口号,侦听网络端口;
-
循环遍历目标局域网所有IP地址,通过调用UDP socket的sendto方法,将"ping"数据包发送给目标IP地址;
-
接收来自各主机的回应,查看是否为"ping"数据包,并将其IP地址记录到online_ips列表中。
这样,我们便可以很方便地实现UDP广播扫描功能,从而快速扫描到目标网络上的所有在线主机IP地址。
2. ping扫描
除了UDP广播扫描,我们还可以使用Python的subprocess库调用系统命令来执行ping操作。示例代码如下:
import subprocess
def ping_scan(ip_prefix):
"""
使用ping命令扫描在线主机
"""
online_ips = []
for i in range(1, 255):
address = ip_prefix + str(i)
ret = subprocess.call(["ping", "-n", "1", "-w", "10", address])
if ret == 0:
online_ips.append(address)
print("IP地址为 %s 的主机在线!" % address)
return online_ips
if __name__ == '__main__':
ip_prefix = "192.168.1."
online_ips = ping_scan(ip_prefix)
print("在线主机数量为:%d" % len(online_ips))
在上述代码中,我们使用了Python的subprocess库来调用系统的ping命令来执行ping扫描操作。具体流程如下:
-
循环遍历目标局域网所有IP地址,通过调用subprocess库中的call方法执行ping指令,并指定参数:"-n 1"表示仅发送1个请求;"-w 10"表示等待最长10ms的回应;
-
根据返回码判断目标主机是否在线。
这样,我们便可以使用Python快速实现简单的ping扫描功能。
三、示例说明
示例1:使用UDP广播扫描判断目标网络内所有在线设备
if __name__ == '__main__':
ip_prefix = "192.168.1."
port = 8080
online_ips = broadcast_scan(ip_prefix, port)
print("在线主机数量为: %d" % len(online_ips))
在上述示例中,我们指定了目标局域网的IP地址前缀和端口号,即192.168.1.xxx,同时扫描端口为8080的主机,并通过UDP广播的方式将"ping"数据包发送给目标主机,从而判断主机是否在线。最终,我们会得到该网络上所有在线设备的IP地址列表,以及在线设备的数量。
示例2:使用ping扫描判断目标网络内所有在线设备
if __name__ == '__main__':
ip_prefix = "192.168.1."
online_ips = ping_scan(ip_prefix)
print("在线主机数量为:%d" % len(online_ips))
在上述示例中,我们同样指定了目标局域网的IP地址前缀,即192.168.1.xxx,并通过调用系统的ping命令来执行ping扫描操作,从而判断主机是否在线。最终,我们会得到该网络上所有在线设备的IP地址列表,以及在线设备的数量。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python实现扫描局域网活动ip(扫描在线电脑) - Python技术站