Хост назначения PHP Exec Ping недоступен

Я пингую пару компьютеров (192.168.200.1 и 192.168.200.2) в моей корпоративной локальной сети, которые находятся за маршрутизатором (192.168.200.254).

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 ), и я все равно получаю ответ на пинг.

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),

var_dump($output) при попытке ping 192.168.220.1 отображается как:

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");

По-прежнему показывает себя как успешный. Я, вероятно, делаю что-то не так здесь. Любые идеи?


person vashavoc    schedule 11.03.2013    source источник
comment
in_array не будет работать, потому что он должен соответствовать всему значению элемента. Вместо этого я бы, вероятно, сделал что-то глупое, например, объединил массив в одну строку и preg_match для строки, которую вы ищете. Или, если вы считаете, что это безопасное предположение, просто preg_match для 3-го элемента массива.   -  person Matt    schedule 11.03.2013


Ответы (2)


вам нужно 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/>";
    }    

}

person DiverseAndRemote.com    schedule 11.03.2013
comment
Работал отлично, нашел и это. - person vashavoc; 11.03.2013

in_array будет ожидать всю строку, т.е. «Ответ от 192.168.200.254: хост назначения недоступен». . Вместо этого вы можете использовать strstr php manual strstr функцию php или проверку регулярного выражения. И так как он находится в массиве - как кто-то предложил .. присоединиться к строке массива и попытаться найти текст.

person V_K    schedule 11.03.2013