2017-08-29 140 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。 我希望它有幫助。