2014-01-18 203 views
0

我想用多个IP来运行此操作,并检查IP是否活着,无法访问或请求超时。我无法指出我犯错的地方。我运行这个没有使用循环,它工作正常,但不适用于多个IP for循环。帮助将不胜感激=)使用for循环和执行命令Ping多个IP地址

for ($ipa=100; $ipa <= 110; $ipa++){ 

    $ip = "192.168.254.{$ipa}"; 

    exec ("ping -n 1 -w 1 $ip && exit", $ping_output); 

    if(preg_match("/TTL/i", $ping_output[2])) { 
     echo "{$ip} is On <br/>"; 
    } else if("unreachable"){ 
     echo "{$ip} is unreachable <br/>"; 
    } else if("Request"){ 
     echo "{$ip} is Off <br/>"; 
    } 

} 
+0

你怎么操作多个IP? –

+0

“但不适用于多个IP”请详细说明。 –

+0

为什么在PHP中完成?你为什么不使用一些为此而设计的工具,比如nmap? – arkascha

回答

1

看着-n开关,你在Windows上运行这个。有一些警告在Windows上运行exec,但是因为它工作了一次,我不会去那里。另一件事是,您需要每次都取消设置$ ping_output,以便脚本使用最新的数据。否则,exec会将数据追加到这个数组中。最后,其他条款将永远返回true。 如果您从var_dump行中发布一些输出以查看是否存在运行使用特定IP的ping的错误,这将有所帮助。

这是我对这个剧本的建议。我已将preg_match更改为stripos,这是检查子字符串是否存在的更快方法。

for ($ipa=100; $ipa <= 110; $ipa++){ 
    $ip = "192.168.254.".$ipa; 
    $ping_output=array(); 
    exec ("ping -n 1 -w 1 $ip 2>&1", $ping_output, $return_val); 
    echo $ip." -> ".$return_val."<br/>".implode('<br/>',$ping_output).'<br/>'; 

    if(stripos($ping_output[2],"TTL")!==false) { 
    echo $ip." is On <br/>"; 
    } else if(stripos($ping_output[2],"unreachable")!==false){ 
    echo $ip." is unreachable <br/>"; 
    } else if(stripos($ping_output[2],"request")!==false){ 
    echo $ip." is Off <br/>"; 
    } 
} 
+0

已解决!非常感谢你@Dobromir Velev! – user3173658

0

您可以礼仪您的IPS到一个文本文件,然后使用该文件如ping IPS;

for ($ipa=100; $ipa <= 110; $ipa++){ 

    $ip = "192.168.254.{$ipa}"; 

    exec ("ping -n 1 -w 1 $ip 2>&1", $ping_output, $return_val); 
    var_dump(array($ping_output, $return_val)); 
    if(preg_match("/TTL/i", $ping_output[2])) { 
     echo "{$ip} is On <br/>"; 
    } else if("unreachable"){ 
     echo "{$ip} is unreachable <br/>"; 
    } else if("Request"){ 
     echo "{$ip} is Off <br/>"; 
    } 

} 
+0

嗨,侯赛因,如果我只用于循环会有可能吗?因为当我单独尝试时它工作正常。 – user3173658

+0

根据我的说法,最好逐个使用循环和检查状态。但是,您要批量批处理 –

+0

我没有将它用于批处理文件。我正在浏览器上运行它。 – user3173658