1

我正在从运行 ifconfig 命令的 linux 机器中获取输出。我通过运行 shell_exec 命令来做到这一点。我找到了一个例子,但我似乎无法进一步使用它。

这是我当前的代码。

public function get_network_interfaces() {

    // Run the command.
    $cmd_exec = shell_exec("/sbin/ifconfig");

    // Get the pattern.
    $pattern = '/inet addr:([\d]{1,3}\.[\d]{1,3}\.[\d]{1,3}\.[\d]{1,3})/';

    if (preg_match_all($pattern, $cmd_exec, $matches)) {
        $interfaces = $matches[1];
        return $interfaces;         
    }

}

这个(在foreach'ing之后)的输出很简单;192.168.1.1/127.0.0.1 因为有两个网卡,所以ifconfig的输出是;

eth0      Link encap:Ethernet  HWaddr 00:16:3e:38:b8:1c  
      inet addr:192.168.1.1  Bcast:192.168.1.255  Mask:255.255.255.0
      inet6 addr: 2a02:2308::216:3eff:fe38:b81c/64 Scope:Global
      inet6 addr: fe80::216:3eff:fe38:b81c/64 Scope:Link
      UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
      RX packets:10612623 errors:0 dropped:0 overruns:0 frame:0
      TX packets:151855 errors:0 dropped:0 overruns:0 carrier:0
      collisions:0 txqueuelen:1000 
      RX bytes:539434883 (514.4 MiB)  TX bytes:37861938 (36.1 MiB)
      Interrupt:30
lo        Link encap:Local Loopback  
      inet addr:127.0.0.1  Mask:255.0.0.0
      inet6 addr: ::1/128 Scope:Host
      UP LOOPBACK RUNNING  MTU:16436  Metric:1
      RX packets:6662 errors:0 dropped:0 overruns:0 frame:0
      TX packets:6662 errors:0 dropped:0 overruns:0 carrier:0
      collisions:0 txqueuelen:0 
      RX bytes:768641 (750.6 KiB)  TX bytes:768641 (750.6 KiB)

我想要得到的是接口的名称(eth0 和 lo),以及 inet 添加(已经在工作),然后是 RX 字节和 TX 字节。如果名字太难取,那就这样吧。但是谁能解释我如何获得 RX 字节和 TX 字节?

谢谢。

4

1 回答 1

1

对于接口的名称,这应该有效:

$pattern = '/^(\w*)\s*Link encap.*$/';

对于 RX 和 TX 字节:

$pattern = '/RX packets:(\d*) /';
$pattern = '/TX packets:(\d*) /';

您应该进行测试以确保您拥有每个接口的所有信息:

  1. 测试接口的名称。
  2. 测试 IP 号码。
  3. 测试 RX 字节。
  4. 测试 TX 字节。

当您拥有其中四个时,再进行另一个循环(例如使用continue)。

PS 请注意您在系统中使用的语言,因为使用西班牙语您会得到“Paquetes RX:”。可以肯定的是,为了使您的代码更加健壮,您应该尝试shell_exec将环境变量LC_MESSAGES设置en_us.utf-8为例如。

于 2011-11-05T03:16:01.220 回答