Shell脚本(bash)的查找网络
问题描述:
Shell脚本的IP范围(击)查找的IP范围内的网络Shell脚本(bash)的查找网络
我想创建一个shell脚本来自动寻找IP地址范围是什么的网络。到目前为止,我跑了comamnd:
ifconfig | awk '/broadcast/'
这将创建输出:
inet 192.168.1.228 netmask 255.255.255.0 broadcast 192.168.1.255
我想为shell脚本采取提供的数字(我相信就足以找到一系列IP地址,但纠正我,如果我错了),基本上只输出了一系列所以对我来说,我认为这将是这两个选项之一:
192.168.1.0/24
192.168.1.0-255
192.168.1.*
如果这是找到一个IP范围的方式,那么任何人都可以帮我指出ou如何将它显示为一个简单的输出,就像我之前提到的三个选项之一一样?如果这不是找到IP范围的方法,请你解释一下最准确的方法是如何实现的。我试图更多地了解网络和shell脚本,所以任何帮助都会大大增加。
答
好吧,如果你打算用ifconfig,那么就应该是这样的:
BARRAY=({0..1}{0..1}{0..1}{0..1}{0..1}{0..1}{0..1}{0..1})
PARAMS=$(ifconfig wlan0 | grep netmask | awk '{print $2" "$4}')
IP_ADDRESS=${PARAMS%% *}
IP_ADDRESS=${IP_ADDRESS//./ }
BINARY_IP_ADDRESS=$(for octet in $IP_ADDRESS; do echo -n ${BARRAY[octet]}" "; done)
BIN_IP_SEP1=${BINARY_IP_ADDRESS//1/1 }
BINARY_IP_ARRAY=(${BIN_IP_SEP1//0/0 })
NETMASK=${PARAMS#* }
NETMASK=${NETMASK//./ }
BINARY_NETMASK=$(
for octet in $NETMASK
do
echo -n ${BARRAY[octet]}" "
done
)
BIN_MASK_SEP1=${BINARY_NETMASK//1/1 }
BINARY_MASK_ARRAY=(${BIN_MASK_SEP1//0/0 })
# Count bits in MASK ARRAY
BITS_COUNT=0
for i in ${BINARY_MASK_ARRAY[@]}
do
[ "$i" == "1" ] && BITS_COUNT=$((BITS_COUNT + 1))
done
# Count address
NEW_ADDRESS=""
for i in {0..31}
do
[ $(($i % 8)) -ne 0 ] || NEW_ADDRESS+=" "
if [ "${BINARY_MASK_ARRAY[$i]}" == "1" ]
then
NEW_ADDRESS+="${BINARY_IP_ARRAY[$i]}"
else
NEW_ADDRESS+="${BINARY_MASK_ARRAY[$i]}"
fi
done
# Convert binary to decimal
DECIMAL_ADDRESS=`echo $(for octet in $NEW_ADDRESS; do echo $((2#$octet)); done)`
DECIMAL_ADDRESS=${DECIMAL_ADDRESS// /.}
# Final result
echo $DECIMAL_ADDRESS/$BITS_COUNT
如果你要使用“IP地址显示”然后就正确PARAMS计算根据接收到的数据。无论如何,只有这条线使用外部命令,脚本的其余部分是纯粹的bash。 我希望它有帮助。
'ifconfig' is deprecated,read [here](https://serverfault.com/questions/458628/should-i-quit-using-ifconfig),我认为更好的方法是'ip addr show'或' nmcli dev list iface eth0'(这取决于分配)。 – sKwa
使用http://jodies.de/ipcalc –