PHP Exec Ping 目标主机无法访问

Posted

技术标签:

【中文标题】PHP Exec Ping 目标主机无法访问【英文标题】:PHP Exec Ping Destination host unreachable 【发布时间】:2013-02-27 02:27:53 【问题描述】:

我在路由器 (192.168.200.254) 后面的公司局域网上 ping 几台计算机(192.168.200.1 和 192.168.200.2)。

function pingAddress($TEST) 
$pingresult = exec("ping -n 1 $TEST", $output, $result);
    if ($result == 0) 
        echo "Ping successful!";
         else 
        echo "Ping unsuccessful!";
        

    
pingAddress("192.168.220.1");
pingAddress("192.168.220.2");

我的问题是其中一台计算机未开机 ( .1 ),但我仍然收到 ping 响应。

Pinging 192.168.200.1 with 32 bytes of data:
Reply from 192.168.200.254: Destination host unreachable.
Ping statistics for 192.168.200.1:
Packets: Sent = 1, Received = 1, Lost = 0 (0% loss),

192.168.220.1 ping 尝试上的 var_dump($output) 显示为:

array(6)  
[0]=> string(0) "" 
[1]=> string(44) "Pinging 192.168.200.1 with 32 bytes of data:" 
[2]=> string(57) "Reply from 192.168.200.254: Destination host unreachable." 
[3]=> string(0) "" 
[4]=> string(34) "Ping statistics for 192.168.200.1:" 
[5]=> string(56) " Packets: Sent = 1, Received = 1, Lost = 0 (0% loss)," 

所以我改为尝试搜索为误报“目标主机无法访问”消息创建的 $output 数组,但这条路线没有运气。

function pingAddress($TEST) 
$findme ="Destination host unreachable";

    $pingresult = exec("ping -n 1 $TEST  && exit", $output, $result);
        //echo $result. "<br/>";
        if (($result == 0) AND (in_array($findme, $output)))
            echo "Ping unsuccessful! <br/>";
        
        elseif (($result == 0) AND (!in_array($findme, $output)))
            echo "Ping successful! <br/>";
        
        elseif ($result == 1)
            echo "Ping unsuccessful! <br/>";
            

pingAddress("192.168.220.1");
pingAddress("192.168.220.2");

仍然显示成功。我可能在这里做错了什么。有什么想法吗?

【问题讨论】:

in_array 不起作用,因为它需要匹配元素的整个值。相反,我可能会做一些愚蠢的事情,比如将数组加入单个字符串并 preg_match 为您正在寻找的字符串。或者,如果您认为这是一个安全的假设,只需在数组的第三个元素上进行 preg_match 即可。 【参考方案1】:

你需要的是preg_grep。试试这个:

function pingAddress($TEST) 
    $pingresult = exec("ping -n 1 $TEST  && exit", $output, $result);
    //echo $result. "<br/>";

    if (($result == 0))
        if(count(preg_grep('/Destination host unreachable/i', $output)) == 0)
            echo "Ping successful! <br/>";
        else
            echo "Ping unsuccessful! <br/>";
    
    elseif ($result == 1)
        echo "Ping unsuccessful! <br/>";
        

【讨论】:

效果很好,也发现了这个。【参考方案2】:

in_array 将期望整个字符串,即“从 192.168.200.254 回复:无法访问目标主机。” .您可以改用strstrphp manual strstr php 函数或正则表达式检查。而且由于它在数组中-就像有人建议的那样..加入数组的字符串并尝试查找文本。

【讨论】:

以上是关于PHP Exec Ping 目标主机无法访问的主要内容,如果未能解决你的问题,请参考以下文章

寝室局域网内ping命令目标主机无法访问和请求超时怎么回事

无法访问目标主机怎么解决

两台电脑互ping,出现无法访问目标主机是怎么回事。

ping 192.168.1.1 请求超时或无法访问目标主机是怎么回事

夏虫语冰Win10局域网下两台电脑无法ping通: 无法访问目标主机

虚拟机主机互相 能ping但是主机无法访问虚拟机网站