PHP获取服务器与客户端MAC地址:兼容Windows与Linux的实现方案

江岸
江岸
发布时间:2026-10-14 | 5人浏览过
原创

在服务器管理与身份识别场景中,有时需要通过PHP脚本获取机器的物理网卡地址(MAC地址)。本文将详细说明如何在Windows和Linux环境下通过命令行工具解析出服务器端的MAC地址,并介绍如何通过ARP表间接获取访问客户端的MAC地址。

获取服务器端MAC地址

由于不同操作系统底层命令存在差异,实现这一功能通常采用多态设计。以下代码封装了一个类,能够自动识别当前操作系统是Linux还是Windows,调用对应的系统命令(如ifconfig或ipconfig /all),并通过正则表达式清洗结果以提取有效的MAC地址格式。

<?php
/**
 * 获取网卡的MAC地址原码;目前支持WIN/LINUX系统
 * 获取机器网卡的物理(MAC)地址
 */
class GetmacAddr {
    var $result = array(); // 返回带有MAC地址的字串数组
    var $macAddr;

    /*构造*/
    function __construct($osType) {
        switch ( strtolower($osType) ) {
            case "unix": break;
            case "solaris": break;
            case "aix": break;
            case "linux": {
                $this->for_linux_os();
            }break;
            default: {
                $this->for_windows_os();
            }break;
        }
        $temp_array = array();
        foreach($this->result as $value){
            if(preg_match("/[0-9a-f][0-9a-f][:-]"."[0-9a-f][0-9a-f][:-]"."[0-9a-f][0-9a-f][:-]"."[0-9a-f][0-9a-f][:-]"."[0-9a-f][0-9a-f][:-]"."[0-9a-f][0-9a-f]/i",$value,
            $temp_array ) ){
                $this->macAddr = $temp_array[0];
                break;
            }
        }
        unset($temp_array);
        return $this->macAddr;
    }

    /*linux系统中获取方法*/
    function for_linux_os(){
        @exec("ifconfig -a", $this->result);
        return $this->result;
    }

    /*win系统中的获取方法*/
    function for_windows_os(){
        @exec("ipconfig /all", $this->result);
        if ( $this->result ) {
            return $this->result;
        } else {
            $ipconfig = $_SERVER["WINDIR"]."\\system32\\ipconfig.exe";
            if(is_file($ipconfig)) {
                @exec($ipconfig." /all", $this->result);
            } else {
                @exec($_SERVER["WINDIR"]."\\system\\ipconfig.exe /all", $this->result);
                return $this->result;
            }
        }
    }
}
?

获取客户端MAC地址

在Web应用中获取客户端(浏览器端)的物理MAC地址具有特殊性。由于TCP/IP协议栈的设计,应用层无法直接获取远程主机的链路层地址,必须借助网关的ARP(地址解析协议)表。当客户端与服务器在同一局域网内或通过路由通信时,服务器可以通过查询自身的ARP缓存来发现客户端的MAC地址。

以下是基于arp -a命令提取客户端MAC地址的操作逻辑:

@exec("arp -a",$array); //执行arp -a命令,结果放到数组$array中
foreach($array as $value){
    //匹配结果放到数组$mac_array
    if(strpos($value,$_SERVER["REMOTE_ADDR"]) && preg_match("/(:?[0-9A-F]{2}[:-]){5}[0-9A-F]{2}/i",$value,$mac_array)){
        $mac = $mac_array[0];
        break;
    }
}
echo $mac;

注意事项与限制

  • 本地测试无效:客户端MAC获取代码仅在其他设备访问该服务器时有效。如果直接在服务器本机运行(例如127.0.0.1),由于处于环回接口或不经过正常局域网路由,可能无法从ARP表中查到记录,导致返回空值。只能用别的电脑访问才能输出真实数据。
  • 安全策略限制:exec系列函数在现代服务器环境中常被禁用。若运行失败,请检查php.ini中的disable_functions配置,并确保Web服务器进程拥有执行系统命令的权限(Linux下通常需注意sudo权限配置)。
  • 路由层级:如果客户端位于NAT之后且与服务器不在同一子网,服务器端的ARP表将只存储下一跳路由器或网关的MAC地址,而非最终用户的MAC地址。

总结

上述代码分别解决了服务器端跨平台MAC地址获取以及同网段客户端MAC探测的问题。对于需要高兼容性且受限较少的环境,建议优先考虑服务端MAC校验;若需追踪局域网内客户端,需确保网络架构满足ARP可达性要求。以上就是PHP获取服务器和客户端MAC地址跨平台实现的详细内容,更多关于PHP系统命令集和网络编程的资料请关注本站其它相关文章!

本站声明

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

Python 相关产品和应用

全部下载

专题列表