如何使用 bash 创建所有可能的 IP 组合?
How can I create with bash all the possible combinations of IPs?
这将是输出:
0.0.0.0
0.0.0.1
0.0.0.2
.
.
.
.
255.255.255.253
255.255.255.254
255.255.255.255
也许我需要将它保存到文件中,但我可以使用 >
运算符
轻松做到这一点
好吧,如果 bash 可以处理它,这个表达式就可以了:
echo {0..255}.{0..255}.{0..255}.{0..255} | tr ' ' \n
但是上面的表达式被扩展了 bash,由此产生的 40 亿 IP 炸毁了 shell。相反,您可以像这样编写嵌套循环:
for octet1 in {0..255}
do
for octet2 in {0..255}
do
for octet3 in {0..255}
do
for octet4 in {0..255}
do
echo $octet1.$octet2.$octet3.$octet4
done
done
done
done
你也可以像这样缩短一点:
for octet12 in {0..255}.{0..255}
do
for octet34 in {0..255}.{0..255}
do
echo $octet12.$octet34
done
done
一般来说,bash 语言具有足够的能力来操纵 IP 地址。我有一小部分用于 IP 数学的函数,我可以与您分享这些函数以用于更一般的 IPv4 工作。这是一些使用我的 IP 函数库的代码。 TBH:我称它为 "my library",但我确定我几年前从另一位开发人员那里拿走了它,但我已经失去了归属。
代码如下:
ip_range "0.0.0.0" "255.255.255.255" 1
这是函数集:
#!/usr/bin/env bash
function ip2value() {
local ip= # IP address to convert to decimal
local sum=0
IFS='.' read -ra ADDR <<< "$ip"
for i in "${ADDR[@]}"; do
sum=$(( sum * 256 + i ))
done
echo $sum
}
function value2ip() {
local value=
local ip=""
local divisor=$(( 256 ** 3 ))
for x in 0 1 2
do
ip="$ip.$(( value / divisor ))"
value=$(( value % divisor ))
divisor=$(( divisor / 256 ))
done
ip=${ip#.}
ip=$ip.$value
echo $ip
}
# Usage: addIP <ip> [<count>]
# Increase <ip> by <count> ( default 1)
function nextIP() {
local IP=
local COUNT=
: ${COUNT:=1}
value2ip $(( $COUNT + $( ip2value ) ))
}
function addIPs() {
local IP1=
local IP2=
value2ip $(( $( ip2value $IP1 ) + $( ip2value $IP2 ) ))
}
function isIP() {
local IP=
local VALUE=$( ip2value $IP )
local VIP=$( value2ip $VALUE )
[ "$IP" == "$VIP" ]
}
function ip_range() {
local FIRST=
local LAST=
local STEP=
: ${STEP:=1}
local ip=$(ip2value $FIRST)
local last=$(ip2value $LAST)
while
[ $ip -le $last ]
do
echo $( value2ip $ip )
ip=$(( ip + 1 ))
done
}
这将是输出:
0.0.0.0
0.0.0.1
0.0.0.2
.
.
.
.
255.255.255.253
255.255.255.254
255.255.255.255
也许我需要将它保存到文件中,但我可以使用 >
运算符
好吧,如果 bash 可以处理它,这个表达式就可以了:
echo {0..255}.{0..255}.{0..255}.{0..255} | tr ' ' \n
但是上面的表达式被扩展了 bash,由此产生的 40 亿 IP 炸毁了 shell。相反,您可以像这样编写嵌套循环:
for octet1 in {0..255}
do
for octet2 in {0..255}
do
for octet3 in {0..255}
do
for octet4 in {0..255}
do
echo $octet1.$octet2.$octet3.$octet4
done
done
done
done
你也可以像这样缩短一点:
for octet12 in {0..255}.{0..255}
do
for octet34 in {0..255}.{0..255}
do
echo $octet12.$octet34
done
done
一般来说,bash 语言具有足够的能力来操纵 IP 地址。我有一小部分用于 IP 数学的函数,我可以与您分享这些函数以用于更一般的 IPv4 工作。这是一些使用我的 IP 函数库的代码。 TBH:我称它为 "my library",但我确定我几年前从另一位开发人员那里拿走了它,但我已经失去了归属。
代码如下:
ip_range "0.0.0.0" "255.255.255.255" 1
这是函数集:
#!/usr/bin/env bash
function ip2value() {
local ip= # IP address to convert to decimal
local sum=0
IFS='.' read -ra ADDR <<< "$ip"
for i in "${ADDR[@]}"; do
sum=$(( sum * 256 + i ))
done
echo $sum
}
function value2ip() {
local value=
local ip=""
local divisor=$(( 256 ** 3 ))
for x in 0 1 2
do
ip="$ip.$(( value / divisor ))"
value=$(( value % divisor ))
divisor=$(( divisor / 256 ))
done
ip=${ip#.}
ip=$ip.$value
echo $ip
}
# Usage: addIP <ip> [<count>]
# Increase <ip> by <count> ( default 1)
function nextIP() {
local IP=
local COUNT=
: ${COUNT:=1}
value2ip $(( $COUNT + $( ip2value ) ))
}
function addIPs() {
local IP1=
local IP2=
value2ip $(( $( ip2value $IP1 ) + $( ip2value $IP2 ) ))
}
function isIP() {
local IP=
local VALUE=$( ip2value $IP )
local VIP=$( value2ip $VALUE )
[ "$IP" == "$VIP" ]
}
function ip_range() {
local FIRST=
local LAST=
local STEP=
: ${STEP:=1}
local ip=$(ip2value $FIRST)
local last=$(ip2value $LAST)
while
[ $ip -le $last ]
do
echo $( value2ip $ip )
ip=$(( ip + 1 ))
done
}