使用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
当使用 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