背景:页面应显示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 }' ");
答案 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
。它返回最后一行,没有换行符,因此您不需要修剪它。