我正在从运行 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)
我想要获得的是接口(interface)的名称(eth0 和 lo),以及 inet 添加(已经在工作),后跟 RX 字节和 TX 字节。 如果名字太难取,那就这样吧。但是谁能解释一下如何获取 RX 字节和 TX 字节?
谢谢。
最佳答案
对于接口(interface)的名称,这应该有效:
$pattern = '/^(\w*)\s*Link encap.*$/';
对于 RX 和 TX 字节:
$pattern = '/RX packets:(\d*) /';
$pattern = '/TX packets:(\d*) /';
并且您应该进行测试以确保您拥有每个接口(interface)的所有信息:
- 测试接口(interface)名称。
- 测试 IP 号。
- 测试 RX 字节。
- 测试 TX 字节。
当你有四个时,然后进行另一个循环(例如使用 continue
)。
附言请注意您在系统中使用的语言,因为使用西类牙语您会得到“Paquetes RX:”。可以肯定的是,为了使您的代码更健壮,您应该尝试使 shell_exec
将环境变量 LC_MESSAGES
设置为 en_us.utf-8
例如。
关于PHP 从复杂的字符串中选择文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8017621/