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

时间:2018-12-21 11:01:24

标签: php linux snmp

我正在尝试在IP表上创建一个“ snmpget”,并使用foreach将其显示。我已经在做ping了。在我的网页上,仅显示ping结果。没有snmp结果的迹象。

当我在Linux shell中编写shell_exec()命令并返回“ 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 $4}\''); //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开发人员,因此,如果您有任何其他建议,请不要犹豫。谢谢。

1 个答案:

答案 0 :(得分:1)

您使用单引号来构建命令字符串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。

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