PHP CLI 获取局域网 IP、MAC 及主机名
本实例演示了如何使用 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 输出中包含标题、空行以及非当前局域网的设备信息:
- 识别接口行: 寻找包含“接口”关键字的行,该行通常标记了当前网卡所在的合法 IP 范围起始点。
- 正则匹配 IP: 使用严格的中高级 IP 正则验证,排除非法文本。
- 排除自身: 对比解析出的 IP 是否为
$bIp(本机)。 - 排除特殊地址:
- 跳过网关地址(通常为
$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 局域网扫描的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













