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

以上代码中,