PHP:如何获取特定VLAN的IP地址

时间:2015-09-04 13:27:44

标签: php bash awk

背景:页面应显示mgmt vlan中各种设备的SNMP数据,以遍历网络中的所有IP地址。我需要知道IP地址/网络,接口已打开。

Bash中,这非常有效:

/sbin/ip addr show dev eth0.1100 | /usr/bin/awk  '/global/ { $2=substr($2, 1, length($2)-7); print $2 }'

但在PHP中,我无法找到获取mgmt vlan的IP地址/网络的方法。我试过了:

$mgmtiface = shell_exec("/usr/bin/sudo /usr/bin/awk '$3 == 1100 {print $1}' /proc/net/vlan/config");
$mgmtnet = shell_exec("/sbin/ip addr show dev $mgmtiface | /usr/bin/awk  '/global/ { $2=substr($2, 1, length($2)-7); print $2 }' ");

但PHP并不像pipe in shell_exec

我该如何解决这个问题?

有趣的是,定义硬编码的接口工作正常,但只要我在其中放入一个带有接口的变量,它就无法工作:

$mgmtnet = shell_exec("/sbin/ip addr show dev eth0.1100 | /usr/bin/awk  '/global/ { $2=substr($2, 1, length($2)-7); print $2 }' ");

1 个答案:

答案 0 :(得分:3)

shell_exec返回整个输出,包括尾随换行符。在替换为下一个命令之前,您需要将其修剪掉:

$mgmtiface = teim(shell_exec("/usr/bin/sudo /usr/bin/awk '$3 == 1100 {print $1}' /proc/net/vlan/config"));
$mgmtnet = trim(shell_exec("/sbin/ip addr show dev $mgmtiface | /usr/bin/awk  '/global/ { $2=substr($2, 1, length($2)-7); print $2 }' "));

如果您知道该命令只返回一行输出,则可以使用exec代替shell_exec。它返回最后一行,没有换行符,因此您不需要修剪它。