Answers:
您可以从获取服务器IP地址$_SERVER['SERVER_ADDR']
。
对于MAC地址,您可以解析netstat -ie
Linux中的输出,或者ipconfig /all
Windows中。
您可以从以下位置获取客户端IP $_SERVER['REMOTE_ADDR']
除非在一种特殊情况下,否则客户端MAC地址将不可用:如果客户端与服务器位于同一以太网段中。
所以,如果你正在构建某种基于局域网的系统和你的客户都在同一个以太网段,那么你可以通过解析的输出中获得的MAC地址arp -n
(Linux)或arp -a
(窗口)。
编辑:您在注释中询问如何获取外部命令的输出-一种方法是使用反引号,例如
$ipAddress=$_SERVER['REMOTE_ADDR'];
$macAddr=false;
#run the external command, break output into lines
$arp=`arp -a $ipAddress`;
$lines=explode("\n", $arp);
#look for the output line describing our IP address
foreach($lines as $line)
{
$cols=preg_split('/\s+/', trim($line));
if ($cols[0]==$ipAddress)
{
$macAddr=$cols[1];
}
}
好吧,除非您可以让客户自愿提供这些信息并通过其他方式进行传输,否则您很不走运。
客户端的MAC地址(在发出HTTP请求的计算机的意义上)被客户端和服务器之间的每个路由器覆盖。
客户端IP方便地提供给脚本$_SERVER['REMOTE_ADDR']
。在某些情况下,特别是如果你的Web服务器位于代理(即高速缓存代理)$_SERVER['REMOTE ADDR']
将返回IP的的代理,并且会有一个额外的价值,往往$_SERVER['HTTP_X_FORWARDED_FOR']
,包含原始请求的客户端的IP地址。
有时,尤其是当您处理不受控制的匿名代理时,该代理不会返回真实IP地址,而您所希望的只是代理的IP地址。
我认为您无法在PHP中获得MAC地址,但可以从$_SERVER['REMOTE_ADDR']
变量中获得IP 。
对于Windows Server,我认为您可以使用:
<?php
echo exec('getmac');
?>
exec
`echogetmac
您需要做的就是将arp放入不同的组。
默认:
-rwxr-xr-x 1 root root 48K 2008-11-11 18:11 /usr/sbin/arp*
使用命令:
sudo chown root:www-data /usr/sbin/arp
你会得到:
-rwxr-xr-x 1 root www-data 48K 2008-11-11 18:11 /usr/sbin/arp*
而且由于apache是在用户www-data下运行的守护程序,因此它现在能够执行此命令。
因此,如果您现在使用PHP脚本,例如:
<?php
$mac = system('arp -an');
echo $mac;
?>
您将获得linux arp -an
命令的输出。
arp
二进制文件的组是多余的,www-data
但仍具有other
umode的执行权限。
使用此类(https://github.com/BlakeGardner/php-mac-address)
这是在Unix,Linux和Mac OS X操作系统上用于MAC地址操作的PHP类。它主要是为了帮助欺骗无线安全审核而编写的。
在Windows中,如果用户在本地使用您的脚本,它将非常简单:
<?php
// get all the informations about the client's network
$ipconfig = shell_exec ("ipconfig/all"));
// display those informations
echo $ipconfig;
/*
look for the value of "physical adress" and use substr() function to
retrieve the adress from this long string.
here in my case i'm using a french cmd.
you can change the numbers according adress mac position in the string.
*/
echo substr(shell_exec ("ipconfig/all"),1821,18);
?>
您可以使用以下解决方案来解决您的问题:
$mac='UNKNOWN';
foreach(explode("\n",str_replace(' ','',trim(`getmac`,"\n"))) as $i)
if(strpos($i,'Tcpip')>-1){$mac=substr($i,0,17);break;}
echo $mac;
使用PHP获取MAC地址:(已在Ubuntu 18.04中测试)-2020更新
这是代码:
<?php
$mac = shell_exec("ip link | awk '{print $2}'");
preg_match_all('/([a-z0-9]+):\s+((?:[0-9a-f]{2}:){5}[0-9a-f]{2})/i', $mac, $matches);
$output = array_combine($matches[1], $matches[2]);
$mac_address_values = json_encode($output, JSON_PRETTY_PRINT);
echo $mac_address_values
?>
输出:
{
"lo": "00:00:00:00:00:00",
"enp0s25": "00:21:cc:d4:2a:23",
"wlp3s0": "84:3a:4b:03:3c:3a",
"wwp0s20u4": "7a:e3:2a:de:66:09"
}
也许获得Mac地址不是通过Internet验证客户端计算机的最佳方法。考虑使用令牌代替,该令牌通过管理员的登录信息存储在客户端的浏览器中。
因此,如果管理员通过浏览器将令牌授予客户端,则客户端只能拥有该令牌。如果令牌不存在或无效,则客户端的计算机无效。
您可以 使用此代码获取MAC地址或 物理地址
$d = explode('Physical Address. . . . . . . . .',shell_exec ("ipconfig/all"));
$d1 = explode(':',$d[1]);
$d2 = explode(' ',$d1[1]);
return $d2[1];
因为shell_exec(“ ipconfig / all”)返回所有网络的完整详细信息,所以我使用了很多次爆炸。所以你必须一一拆分 当你运行该代码,那么你会得到
你的MAC地址 00 - ## - ## - CV-12 //这是假的地址,只显示。
// Turn on output buffering
ob_start();
//Get the ipconfig details using system commond
system('ipconfig /all');
// Capture the output into a variable
$mycomsys=ob_get_contents();
// Clean (erase) the output buffer
ob_clean();
$find_mac = "Physical";
//find the "Physical" & Find the position of Physical text
$pmac = strpos($mycomsys, $find_mac);
// Get Physical Address
$macaddress=substr($mycomsys,($pmac+36),17);
//Display Mac Address
echo $macaddress;
这对Windows和ipconfig /all
Windows系统命令都适用于Windows 。
您可以使用openWRT轻松完成此操作。如果您使用强制门户,则可以将php和openWRT混合使用,并在IP和Mac之间建立联系。
您可以使用以下代码编写简单的PHP代码:
$localIP = getHostByName(getHostName());
稍后,使用openWRT可以转到/tmp/dhcp.leases
,您将获得带有以下格式的内容:
e4:a7:a0:29:xx:xx 10.239.3.XXX DESKTOP-XXX
在那里,您有了Mac,IP地址和主机名。