2017-08-29 81 views
1

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脚本,所以任何帮助都会大大增加。

+0

'ifconfig' is deprecated,read [here](https://serverfault.com/questions/458628/should-i-quit-using-ifconfig),我认为更好的方法是'ip addr show'或' nmcli dev list iface eth0'(这取决于分配)。 – sKwa

+0

使用http://jodies.de/ipcalc –

回答

1

好吧,如果你打算用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。 我希望它有帮助。