有个小需求是需要使用PHP来获取到服务器MAC物理网卡地址,于是通过百度获取了一段网上通用的获取方法:
//获取用户电脑MAC地址并生成唯一机器识别码
class GetMacAddr
{
var $result = array();
var $macAddrs = array(); //所有mac地址
var $macAddr; //第一个mac地址
function __construct($OS){
$this->GetMac($OS);
}
function GetMac($OS){
switch ( strtolower($OS) ){
case "unix": break;
case "solaris": break;
case "aix": break;
case "linux":
$this->getLinux();
break;
default:
$this->getWindows();
break;
}
$tem = array();
foreach($this->result as $val){
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",$val,$tem) ){
$this->macAddr = $tem[0];//多个网卡时,会返回第一个网卡的mac地址,一般够用。
break;
//$this->macAddrs[] = $temp_array[0];//返回所有的mac地址
}
}
unset($temp_array);
return $this->macAddr;
}
//Linux系统
function getLinux(){
@exec("/usr/sbin/ifconfig -a", $this->result);
//var_dump($this->result);
return $this->result;
}
//Windows系统
function getWindows(){
@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;
}
}
}
}
这个代码在window主机下没问题,但是在linux主机上发现获取到的mac地址为空,经过一番排查发下,主要由于一下原因引起:
用which找到该Linux命令的绝对路径,使用绝对路径执行就可以了
举例:
exec("ifconfig -a",$output);
-------------
#which ifconfig 或则whereis ifconfig
exec("/sbin/ifconfig -a",$output);
所以,把上面的Linux系统获取mac的方法调整成完整的路径(需要自己去服务器上使用which查询完整路径)就好了,
//Linux系统
function getLinux(){
@exec("/usr/sbin/ifconfig -a", $this->result);
return $this->result;
}
网友评论