Python查看局域网内所有IP和MAC地址
引言
在局域网中,查看局域网内所有IP和MAC地址是一项常见的任务。本文将教会你如何使用Python编程语言来实现这一功能。在开始之前,你需要具备基本的Python编程知识和对网络协议的了解。
步骤概览
下面是整个过程的步骤概览,我们将在后续的内容中逐步展开这些步骤。
步骤 | 描述 |
---|---|
步骤一 | 导入必要的模块 |
步骤二 | 获取本机的IP地址 |
步骤三 | 扫描局域网内的设备 |
步骤四 | 获取设备的MAC地址 |
步骤五 | 打印局域网内所有IP和MAC地址的列表 |
代码实现
步骤一:导入必要的模块
我们首先需要导入一些Python模块来帮助我们实现这个任务。
import os
import sys
import platform
import subprocess
import re
os
模块提供了与操作系统相关的功能,比如执行系统命令。sys
模块提供了对解释器相关的操作和变量的访问。platform
模块用于获取系统的平台信息。subprocess
模块用于创建新的进程和连接它们的输入、输出和错误管道。re
模块提供了正则表达式的支持。
步骤二:获取本机的IP地址
我们需要获取本机的IP地址作为扫描的起点。
def get_local_ip():
sys_type = platform.system()
if sys_type == "Windows":
return subprocess.getoutput("ipconfig")
elif sys_type == "Linux":
return subprocess.getoutput("ifconfig")
elif sys_type == "Darwin":
return subprocess.getoutput("ifconfig")
else:
return "Unsupported system"
以上代码中,我们定义了一个名为get_local_ip()
的函数,根据不同的操作系统来执行相应的命令来获取本机的IP地址。
步骤三:扫描局域网内的设备
我们需要通过扫描局域网来获取局域网内的设备。这里我们可以使用Ping命令来实现。
def scan_local_network(subnet):
devices = []
ip_range = subnet + ".1-255"
ping_args = ["ping", "-c", "1", "-W", "1", "-n"]
ping_cmd = " ".join(ping_args) + " {}"
for i in range(1, 256):
ip = subnet + "." + str(i)
ping_result = subprocess.call(ping_cmd.format(ip), shell=True, stdout=subprocess.PIPE)
if ping_result == 0:
devices.append(ip)
return devices
以上代码中,我们定义了一个名为scan_local_network()
的函数,通过执行Ping命令来扫描指定子网中的设备。函数的输入参数是子网的前缀,返回值是一个包含所有在线设备IP地址的列表。
步骤四:获取设备的MAC地址
我们通过执行ARP命令来获取设备的MAC地址。
def get_mac_address(ip):
if platform.system() == "Windows":
arp_args = ["arp", "-a"]
arp_cmd = " ".join(arp_args)
arp_result = subprocess.check_output(arp_cmd, shell=True, stderr=subprocess.STDOUT)
mac_search = re.search(ip + ".*?([0-9a-f]{2}(?:[-:][0-9a-f]{2}){5})", arp_result.decode("utf-8"), re.IGNORECASE)
if mac_search:
return mac_search.group(1)
elif platform.system() == "Linux" or platform.system() == "Darwin":
arp_args = ["arp", ip]
arp_cmd = " ".join(arp_args)
arp_result = subprocess.getoutput(arp_cmd)
mac_search = re.search("(([a-f\d]{1,2}\:){5}[a-f\d]{1,2})", arp_result, re.IGNORECASE)
if mac_search:
return mac_search.group(1)
return None
以上代码中,