使用seq生成所有可能的ipv4地址?

Generate all possible ipv4 addresses using seq?

当使用 seq 生成 ip 地址时,我使用 seq 0 255 并生成最后一个八位位组。我如何转换它以便它生成所有其他八位字节及其可能的组合(超过 400 万种组合)。任何帮助开始将不胜感激

使用 awk 和四个循环:

awk 'BEGIN{OFS="."; for(h=0;h<256;h++){for(i=0;i<256;i++){for(j=0;j<256;j++){for(k=0;k<256;k++){print h,i,j,k}}}}}'

使用 C 和四个循环:

将此文件命名为 ipgen.c:

#include <stdio.h>

int main() {
  int h, i, j, k;

  for (h = 0; h < 256; h++) {
    for (i = 0; i < 256; i++) {
      for (j = 0; j < 256; j++) {
        for (k = 0; k < 256; k++) {
          printf("%d.%d.%d.%d\n", h, i, j, k);
        }
      }
    }
  }
  return 0;
}

编译它:gcc ipgen.c -o ipgen

开始吧:./ipgen

为了速度,我会投票支持 4 路 awk/for 循环(根据 Cyrus 的评论),但我想我会看一下递归函数:

tuple () {

local level=                                 # number of tuples to generate
local max=                                   # assume tuples are numbered 1 to max
local in=                                    # current tuple from parent

local pfx="."                                  # for all but the topmost call we append a period on the front of our loop counter

[[ -z "${in}" ]] && pfx=""                     # topmost call appends no prefix

local i
local out

for (( i=1 ; i<=${max} ; i++ ))
do
    out="${in}${pfx}${i}"

    if [[ "${level}" -eq 1 ]]                  # if we've reached the bottom of our function calls
    then
         echo "${out}"                         # print our latest string
    else
        tuple $((level-1)) "${max}" "${out}"   # otherwise recurse with the latest string
    fi
done
}

要构建值范围为 1 到 2 的三元组:

$ tuple 3 2
1.1.1
1.1.2
1.2.1
1.2.2
2.1.1
2.1.2
2.2.1
2.2.2

要构建值范围为 1 到 4 的三元组:

$ tuple 3 4
1.1.1
1.1.2
1.1.3
1.1.4
1.2.1
 ...
4.3.4
4.4.1
4.4.2
4.4.3
4.4.4

构建一个值范围为 1 到 255 的 4 元组(请记住,这是 NOT 会很快,因为我们正在制作一个 LOT 次 bash 级调用):

$ tuple 4 255
1.1.1.1
1.1.1.2
1.1.1.3
1.1.1.4
1.1.1.5
1.1.1.6
1.1.1.7
1.1.1.8
1.1.1.9
1.1.1.10
... if you let it run long enough ...
255.255.255.250
255.255.255.251
255.255.255.252
255.255.255.253
255.255.255.254
255.255.255.255

如果您正在寻找 bash 解决方案:

for h in {1..255}; do for i in {1..255}; do for j in {1..255}; do for k in {1..255}; do echo "$h.$i.$j.$k"; done; done; done; done

或多行版本

for h in {1..255}
  do for i in {1..255}
    do for j in {1..255}
      do for k in {1..255}
        do echo "$h.$i.$j.$k"
      done
    done
  done
done

或者如果您真的打算使用 seq

for h in `seq 255`; do for i in `seq 255`; do for j in `seq 255`; do for k in `seq 255`; do echo "$h.$i.$j.$k"; done; done; done; done