【问题标题】:PHP: How to get the IP address of a specific VLANPHP:如何获取特定 VLAN 的 IP 地址
【发布时间】:2015-09-04 13:27:44
【问题描述】:

背景:页面应显示来自管理 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 }' ");

【问题讨论】:

  • 使用shell_exec,管道对我来说工作得很好。
  • 你用 ip addr 试过我的例子了吗?使用像 eth0 这样的任何其他接口而不是 $mgmtiface 应该显示其 ipaddress 的前三个部分
  • 我在 OS X 上,我没有 ip addr 命令。
  • 我测试了shell_exec("echo foobar | grep -o ba"); 并且管道正常工作。
  • 对,似乎是变量而不是管道在制造麻烦。我更新了问题

标签: php bash awk


【解决方案1】:

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。它返回最后一行,没有换行符,所以你不需要修剪它。

【讨论】:

  • 它每次都必须照顾的微小部分......非常感谢!
猜你喜欢
  • 2011-02-07
  • 1970-01-01
  • 2010-12-26
  • 1970-01-01
  • 2010-12-15
  • 1970-01-01
  • 1970-01-01
  • 2019-08-25
相关资源
最近更新 更多