使用PHP读取网络配置


Read network-configuration with PHP

PHP知道$_SERVER["SERVER_ADDR"]中自己的IP,但我如何读取其余的网络配置网络掩码、广播等?

一种解决方案是在我的Linux服务器上用exec获取信息,但这将是一个相当复杂的正则表达式来分割这些信息。

Ubuntu:

exec("/sbin/ifconfig", $data);
$data = implode($data, "'n");
foreach (preg_split("/'n'n/", $data) as $int) {
  preg_match("/^([A-z]*'d)'s+Link's+encap:([A-z]*)'s+HWaddr's+([A-z0-9:]*).*" .
    "inet addr:([0-9.]+).*Bcast:([0-9.]+).*Mask:([0-9.]+).*" .
     "MTU:([0-9.]+).*Metric:([0-9.]+).*" .
     "RX packets:([0-9.]+).*errors:([0-9.]+).*dropped:([0-9.]+).*overruns:([0-9.]+).*frame:([0-9.]+).*" .
     "TX packets:([0-9.]+).*errors:([0-9.]+).*dropped:([0-9.]+).*overruns:([0-9.]+).*carrier:([0-9.]+).*" .
     "RX bytes:([0-9.]+).*'((.*)').*TX bytes:([0-9.]+).*'((.*)')" .
     "/ims", $int, $regex);
    if (!empty($regex)) {
      $interface = array();
      $interface = array(); 
      $interface['name'] = $regex[1]; 
      $interface['type'] = $regex[2]; 
      $interface['mac'] = $regex[3]; 
      $interface['ip'] = $regex[4]; 
      $interface['broadcast'] = $regex[5]; 
      $interface['netmask'] = $regex[6]; 
      $interface['mtu'] = $regex[7]; 
      $interface['metric'] = $regex[8]; 
      $interface['rx']['packets'] = $regex'[9]; 
      $interface['rx']['errors'] = $regex'[10]; 
      $interface['rx']['dropped'] = $regex'[11]; 
      $interface['rx']['overruns'] = $regex'[12]; 
      $interface['rx']['frame'] = $regex'[13]; 
      $interface['rx']['bytes'] = $regex'[19]; 
      $interface['rx']['hbytes'] = $regex'[20]; 
      $interface['tx']['packets'] = $regex'[14]; 
      $interface['tx']['errors'] = $regex'[15]; 
      $interface['tx']['dropped'] = $regex'[16]; 
      $interface['tx']['overruns'] = $regex[17]; 
      $interface['tx']['carrier'] = $regex[18]; 
      $interface['tx']['bytes'] = $regex[21]; 
      $interface['tx']['hbytes'] = $regex[22];
      $interfaces[] = $interface;
    }
}

来源:正则表达式模式解析ifconfig

http://www.highonphp.com/regex-pattern-parsing-ifconfig

您可以使用exec()函数运行ipconfig或ifconfig,具体取决于您的服务器以及您是否有权限。然后,您需要从返回的字符串数组中抓取结果。

exec('ifconfig',$output); //use ipconfig for windows
print_r($output);

如果你不想使用ifconfig,你可以创建一个自定义脚本,你仍然可以使用exec(),但它有更干净的输出,更容易操作。