PHP CLI 获取局域网 IP、MAC 及主机名

顾星河
顾星河
发布时间:2026-10-14 | 2人浏览过
原创

本实例演示了如何使用 PHP 脚本在命令行环境(CLI)中自动发现局域网内的其他计算机。通过调用系统 `arp -a` 命令并结合 PHP 的网络相关函数,可精准提取局域网中在线设备的 IP 地址、MAC 地址及主机名,同时自动过滤网关、广播地址及无效数据,具有较高的参考借鉴价值。

实现原理与结果

该方案的核心在于利用操作系统底层的 ARP 缓存表。Windows 系统中的 `arp -a` 命令会列出当前已知的所有局域网节点的映射关系。PHP 通过 exec() 函数捕获该命令的输出,随后利用正则表达式解析出有效的 IPv4 地址,并反向查询其对应的 MAC 地址和主机名。

第1步:配置环境与准备

操作需在服务器或本地电脑的命令提示符(CMD/PowerShell)或终端中运行 PHP CLI 模式。确保当前用户拥有执行系统命令的权限。由于涉及网络接口信息的读取,此方法主要适用于 Windows 操作系统;Linux/macOS 通常使用 arp 或 nmap 替代部分逻辑。

第2步:获取本机基础信息

首先获取执行脚本机器的 IP 地址和主机名,作为后续过滤本网卡流量的基准:

<?php
// 获取本机局域网 IP
$bIp = gethostbyname($_ENV['COMPUTERNAME']);
echo "本机IP:" . $bIp . "\n";
// 根据 IP 反向解析主机名
echo "本机主机名:" . gethostbyaddr($bIp) . "\n\n";
?>

这里使用 $_ENV['COMPUTERNAME'] 环境变量配合 gethostbyname() 是一种简洁获取本机 IP 的方式,有别于传统的硬编码写法。

第3步:调用系统命令获取 ARP 表

构造局域网网段前缀,并执行系统命令抓取 ARP 缓存数据:

// 提取前三段作为子网掩码依据
list($ipd1, $ipd2, $ipd3) = explode('.', $bIp);
$mask = $ipd1 . "." . $ipd2 . "." . $ipd3;

// 执行 arp -a 命令并返回数组
exec('arp -a', $aIp); foreach ($aIp as $ipv) { ... }

第4步:解析并过滤无效 IP

遍历 arp -a 的输出行,进行严格的格式校验和逻辑过滤。这一步至关重要,因为 ARP 输出中包含标题、空行以及非当前局域网的设备信息:

  1. 识别接口行: 寻找包含“接口”关键字的行,该行通常标记了当前网卡所在的合法 IP 范围起始点。
  2. 正则匹配 IP: 使用严格的中高级 IP 正则验证,排除非法文本。
  3. 排除自身: 对比解析出的 IP 是否为 $bIp(本机)。
  4. 排除特殊地址:
    • 跳过网关地址(通常为 $mask.1)。
    • 跳过广播地址(通常为 $mask.255)。
    • 跳过 Internet 标识的节点。
    • 跳过组播地址(224.x.x.x - 239.x.x.x)。

第5步:输出目标信息

对于通过所有过滤条件的有效 IP,执行以下操作: - 使用 explode('|') 拆分格式化后的 ARP 数据行。 - 输出 IP 地址、MAC 地址(物理地址)。 - 调用 gethostbyaddr() 尝试解析对应的主机名。

完成判断

运行完成后,控制台应清晰打印出类似于如下的结构,且每条记录之间有空行分隔:

IP地址:|192.168.1.105|
MAC地址:aa-bb-cc-dd-ee-ff
主机名:DESKTOP-USER

IP地址:|192.168.1.106|
MAC地址:xx-yy-zz-mm-nn-oo
主机名:LAPTOP-ADMIN

简要总结

本脚本展示了 PHP 在处理系统底层网络数据时的能力。关键在于对 exec() 返回的非结构化文本进行清洗,以及对 ARP 协议数据的正确理解。虽然该脚本主要面向 Windows 平台,但其解析思路(调用命令行工具 -> 管道处理 -> 正则过滤)同样适用于其他支持类似命令的操作系统,只需替换具体的命令参数即可。 以上就是PHP CLI 获取局域网设备 IP、MAC 及主机名的详细内容,更多关于PHP 局域网扫描的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表