我正在尝试在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开发人员,因此,如果您有任何其他建议,请不要犹豫。谢谢。
答案 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之类的东西是否不允许它。