【问题标题】:Generate all possible ipv4 addresses using seq?使用 seq 生成所有可能的 ipv4 地址?
【发布时间】:2021-03-11 22:37:17
【问题描述】:

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

【问题讨论】:

  • 我建议使用awk 四个循环。
  • 如果时间问题,我建议使用C

标签: bash ip ipv4 seq


【解决方案1】:

如果您正在寻找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

【讨论】:

    【解决方案2】:

    带有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

    【讨论】:

    • 您的第一个实现实际上是我刚刚设法完成的工作,您对四个循环的第一条评论是有道理的。
    【解决方案3】:

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

    tuple () {
    
    local level=$1                                 # number of tuples to generate
    local max=$2                                   # assume tuples are numbered 1 to max
    local in=$3                                    # 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 的 3 元组:

    $ 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
    

    构建一个 3 元组,其值范围为 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 元组(请记住,这不会会很快,因为我们正在制作 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-20
      • 2021-03-18
      • 1970-01-01
      • 2015-01-17
      • 2011-09-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多