不显示在 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 之类的东西不允许它。
我正在尝试在 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 之类的东西不允许它。