2015-10-10 23 views
1

可以用另一種方式寫這個腳本來增加這樣的ip地址whitout循環嗎?腳本,一個端口掃描器,工作正常,我的只是一個關於效率的問題。對不起,我的英語和感謝您的答案。在一個shell腳本中增加IP地址

#!/bin/bash 
ip=$1 
IFS=. read i1 i2 i3 i4 <<< "$ip" 
port=$2 
max=255 

    while [ $i1 -le $max ];do 
     while [ $i2 -le $max ]; do 
      while [ $i3 -le $max ]; do 
        while [ $i4 -le $max ]; do 
        timeout 0.4 bash -c "echo >/dev/tcp/$i1.$i2.$i3.$i4/$port" && echo "on $i1.$i2.$i3.$i4 port $port is open" 
         i4=$(($i4+1)) 
        done 
      i4=0 
      i3=$(($i3+1)) 
      done 
     i3=0 
     i2=$(($i2+1)) 
     done 
    i2=0 
    i1=$(($i1+1)) 
    done 

回答

2

看看:

i1=0; i2=0; i3=0; i4=0 
max=255 
eval printf -v ip "%s\ " {$i1..$max}.{$i2..$max}.{$i3..$max}.{$i4..$max} 

for i in $ip; do 
    # do here somthing with $i 
done 
+0

有沒有辦法在文本文件中輸入eval命令的輸出? –

+0

你是不是這個意思? '因爲我在$ ip;做回聲「$我」;完成' – Cyrus

+0

是的,但在這種情況下,我們將利用另一個循環方案,而從而。 eval是有趣的函數謝謝,但我怎麼能操縱輸出元素?因爲你發佈的腳本給了我一個完整的輸出流。謝謝你的時間賽勒斯 –

2

此功能只是打印下一個IP:

nextip(){ 
    IP=$1 
    IP_HEX=$(printf '%.2X%.2X%.2X%.2X\n' `echo $IP | sed -e 's/\./ /g'`) 
    NEXT_IP_HEX=$(printf %.8X `echo $((0x$IP_HEX + 1))`) 
    NEXT_IP=$(printf '%d.%d.%d.%d\n' `echo $NEXT_IP_HEX | sed -r 's/(..)/0x\1 /g'`) 
    echo "$NEXT_IP" 
} 

所以,你可以增加它想:

FIRST_IP=192.168.1.250 
NUM=10 

IP=$FIRST_IP 
for i in $(seq 1 $NUM); do 
    echo $IP 
    IP=$(nextip $IP) 
done 

輸出示例:

192.168.1.250 
192.168.1.251 
192.168.1.252 
192.168.1.253 
192.168.1.254 
192.168.1.255 
192.168.2.0 
192.168.2.1 
192.168.2.2 
192.168.2.3