不显示在 foreach 中启动的函数中 shell_exec 的结果

The result of a shell_exec in function launched in a foreach is not displayed

我正在尝试在 IP table 上制作 "snmpget" 并使用 foreach 显示它。我已经在执行 ping 操作了。在我的网页上,只显示 ping 结果。没有 snmp 结果的迹象。

shell_exec() 中的命令在我将其写入 Linux shell 和 return“6.0.0”时起作用。对于每个 IP(是的,带有“”)。

    <html>
    <body>
    <?php
            ini_set('display_errors',1); error_reporting(E_ALL); //debug

            function pingAddress($ip) {
                 $pingresult = exec("ping -c 1 $ip", $outcome, $status);
                    if (0 == $status) {
                        $status = "reachable";
                    } else {
                        $status = "unreachable!";
                    }
                    echo "<p>IP state: <strong>$ip</strong> is".$status."</p>";
            }

            function snmp($ip) {
                 $snmpresult = shell_exec('snmpget -v 2c -c public $ip 1.1.1.1.1.1.1.1.1.1.0 | awk \'{print }\''); //changed the OID just for confidentiality
                 echo $snmpresult;
            }

            $arr = array('192.168.1.11', '192.168.1.12', '192.168.1.2');
            foreach ($arr as &$value) {
                 pingAddress($value);
                 snmp($value);
            }

            unset($value);
    ?>
    </body>
    </html>

我网页上的实际结果是这样的:

IP state: 192.168.1.11 is reachable
IP state: 192.168.1.12 is reachable
IP state: 192.168.1.2 is reachable

而且我没有看到 snmp() 结果。任何想法?我远不是真正的 PHP 开发人员,所以如果您有任何其他建议,请不要犹豫。谢谢。

您使用单引号构建命令字符串,so $ip is not interpolated

此外,您没有为自己提供任何方法来查看 snmpget 命令发出的错误消息,否则这可能会更加明显。

快速解决方法如下:

function snmp($ip)
{
    $oid = "1.1.1.1.1.1.1.1.1.1.0";
    $cmd = "snmpget -v 2c -c public $ip $oid | awk '{print $4}'";
    $snmpresult = shell_exec($cmd);
    echo $snmpresult;
}

我已将字符串拆分为变量,以便我们更好地阅读它,而且现在您可以打印 $cmd 进行调试(这也会揭示您的错误)。

而且我建议返回结果而不是直接 echo 处理它,这样调用范围可以根据需要用它做其他事情。

为了更好的诊断和更好的整体代码,请考虑切换到内置的 snmpget 函数;直接 shell 命令几乎总是一个 hack。

您还应该记住,出于安全原因,网络服务器通常 运行 处于受限上下文中,从而阻止执行某些操作。如果 snmpget 根本不起作用,您可以看看是否像 SELinux 之类的东西不允许它。