0

我有以下代码:

$ipgiven = $argv[1];
//REGEX PATTERNS
$patternone = "/^\d{1,3}\.$/";
$patterntwo = "/\d{1,3}\.\d{1,3}\./";
$patternthree = "/\d{1,3}\.\d{1,3}\.\d{1,3}\./";


if(preg_match($patternthree, $ipgiven)){
echo "found depth of 3\r\n";
while($i!=255){
$ipo = $ipgiven . $i;

while($j!=255){
$ipd = $ipo . $j;

while($k!=255){
$ipt = $ipd . $k;
$checkme = $prefix . $ipt . $find;
checkurl($checkme);
$k++;
}

$j++;
}

$i++;
}
}

if(preg_match($patterntwo, $ipgiven)){
echo "found depth of 2\r\n";
while($i!=255){
$ipo = $ipgiven . $i;

while($j!=255){
$ipd = $ipo . $j;
$checkme = $prefix . $ipd . $find;
checkurl($checkme);
$j++;
}

$i++;
}
}

if(preg_match($patternone, $ipgiven)){
echo "found depth of 1\r\n";
while($i!=255){
$ipo = $ipgiven . $i;
$checkme = $prefix . $ipo . $find;
checkurl($checkme);
$i++;
}
}

如果某个目录存在,我想用它来检查 iprange。我已经制定了 curl 代码,但是我缺少的是我的 IP 生成算法。

我想通过以下方式调用脚本:php script.php 1.2.3。

然后脚本将遍历 1.2.3.1 -> 1.2.3.255 这可行,但是调用:php script.php 1.2。只进行 1.2.1 -> 1.2.255 的交互,这并不是真正的 iprange,这有点破坏我的程序。

有人可以帮忙吗?

4

2 回答 2

1

我冒昧地修改了您的代码:

function scan_ips($ip) {

  $depth = preg_match_all('/\d{1,3}\./', $ip, $m);

  for($i=1; $i<=255; $i++) {
    if($depth < 3) {
      scan_ips($ip."$i.");
    } else {
      checkurl($ip.$i);
    }
  }
}

scan_ips($argv[1]);

这应该可以按您的预期工作。

编辑

这个怎么运作:

$depth = preg_match_all('/\d{1,3}\./', $ip, $m)

返回在 ip 中被找到的次数\d{1,3}\.,当前深度。

if($depth < 3)

如果深度已经是3,我们只需要再增加一个数字就可以生成一个有效的ip。如果不是,我们需要添加更多数字。这些数字是通过递归调用添加的:

scan_ips($ip."$i.");

这会再次调用相同的函数,但使用的 ip 长一个数字。

于 2012-06-08T16:16:46.273 回答
0

用法:php ips.php 253.168.11.2 253.168.11.3。适用于任何范围,包括 1.1.1.1 到 2.3.1.255。

<?php
if(!isset($argv[1]) || !isset($argv[2]))
{
    echo PHP_EOL."Invalid usage. Valid usage example: php ips.php 253.168.0.1 253.168.11.255".PHP_EOL;
    exit(1);
}
if(
    !filter_var($argv[1], FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)
    || !filter_var($argv[2], FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)
)
{
    echo PHP_EOL."Invalid IPv4 dotted format. Valid usage example: php ips.php 192.168.0.1 192.168.11.255".PHP_EOL;
    exit(1);
}

//IPv4 addresses are 32bit unsigned and the PHP integer is 32bit signed. 
//Because IPs greater than 0x7fffffff cannot be represented using int, string + BC Math functions are used instead of int + normal math operators.

//get string representation of unsigned integer
$strIPv4Start=sprintf("%u", ip2long($argv[1]));
$strIPv4End=sprintf("%u", ip2long($argv[2]));
$strIPv4Current=$strIPv4Start;

while(bccomp($strIPv4Current, $strIPv4End)<=0)
{
    $strIPv4Current=bcadd($strIPv4Current, "1");

    echo long2ip($strIPv4Current).PHP_EOL;
}
于 2012-06-08T17:19:53.573 回答