当前位置: 首页 > news >正文

python之使用scapy扫描本机局域网主机,输出IP/MAC表

安装scapy库

pip install scapy -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple

扫描本机局域网的所有主机,输出IP/MAC对于表

# -*- coding: UTF-8 -*-
import netifaces
from scapy.all import srp
from scapy.layers.l2 import ARP, Ether
import ipaddress


def get_local_network():
    """获取本机IP段/掩码"""
    ip_mask = []
    for iface in netifaces.interfaces():
        addrs = netifaces.ifaddresses(iface)
        if netifaces.AF_INET in addrs:
            for addr_info in addrs[netifaces.AF_INET]:
                if 'addr' in addr_info and 'netmask' in addr_info:
                    ip = addr_info['addr']
                    mask = addr_info['netmask']
                    if ip != '127.0.0.1':
                        network = ipaddress.IPv4Network(f"{ip}/{mask}", strict=False)
                        netmask = sum(bin(int(x)).count('1') for x in mask.split('.'))
                        ip_mask.append(f"{network.network_address}/{netmask}")

    return ip_mask


def scan_network(ip_range):
    """
    扫描指定 IP 范围内的主机,获取 IP 和 MAC 地址的对应关系
    :param ip_range: IP 范围,例如 "192.168.0.0/24"
    :return: IP/MAC 对应表
    """
    # ARP 请求包
    arp_request = ARP(pdst=ip_range)
    # 广播帧
    ether_frame = Ether(dst="ff:ff:ff:ff:ff:ff")
    # 数据包
    packet = ether_frame / arp_request

    # 发送并接收响应
    result = srp(packet, timeout=3, verbose=0, filter="arp")[0]

    # 解析结果
    ip_mac_table = []
    for sent, received in result:
        ip = received.psrc
        mac = received.hwsrc
        ip_mac_table.append((ip, mac))

    return ip_mac_table


def print_ip_mac_table(ip_mac_table):
    """
    打印 IP/MAC 对应表
    :param ip_mac_table: IP/MAC 对应表
    """
    print("IP/MAC 对应表:")
    print("-" * 35)
    print(f"{'IP':<15}{'MAC':<17}")
    print("-" * 35)
    for ip, mac in ip_mac_table:
        print(f"{ip:<15}{mac:<17}")
    print("-" * 35)


if __name__ == "__main__":
    ip_mac_table_result = []

    for ip_range in get_local_network():
        print(f"开始扫描 {ip_range} ...")
        ip_mac_table_result += scan_network(ip_range)

    print_ip_mac_table(ip_mac_table_result)

输出

开始扫描 192.168.0.0/24 ...
IP Address       MAC Address         
--------------------------------------
192.168.0.113    4c:5f:70:6d:db:ca

相关文章:

  • OpenHarmony体系架构深度解析
  • Three.js 进阶(灯光阴影关系和设置、平行光、阴影相机)
  • Vue动态组件完全指南:原理、使用场景与最佳实践
  • 消防设施操作员考试:用故事开启高效备考之旅​
  • 数据分析项目:直播电商用户流失分析
  • 微信小程序面试内容整理-生命周期函数
  • Mamba| Miniforge3 安装和配置
  • 【Python 数据结构 14.邻接表】
  • 【鸿蒙开发】Hi3861学习笔记- GPIO之LED
  • Excel中国式排名,3种方法!
  • b站视频下载工具软件怎么下载
  • const_cast
  • c++ 中的引用
  • Jenkins链接私有仓库Failed to connect to repository,stderr: No ECDSA...的问题
  • 英语学习(GitHub学到的分享)
  • 革新音频技术,引领智能录音新时代—广州唯创电子WT2605芯片深度解析
  • HippoRAG 2 原理精读
  • (语法笔记 分析题解语法 二分 “unordered_map与vector<pair<>>“ 快速数组)leetocde 1146
  • Shardingsphere-jdbc 自定义脱敏规则
  • 分割回文串 (leetcode 131
  • 外企聊营商|上海仲裁:化解跨国企业纠纷的“上海路径”
  • 孟夏韵评《无序的学科》丨误读与重构的文化漂流
  • “走进书适圈”:一周城市生活
  • 特朗普称即将与伊朗达成核协议,外交部:中方愿继续发挥建设性作用
  • 铁路端午假期运输火车票今日开售,12306提升应对超大规模并发访问需求能力
  • 长期吃太饱,身体会发生什么变化?