shell脚本,实现脚本ip地址变换,每次输出不同的ip地址。

1. 脚本如下其作用是:
echo "$x ...“时, 每次要输出不同的ip地址。
# ./run_payload.sh -e ip_list.txt -s 192.168.33.36-33.49
// run_payload.sh 文件内容如下:
-------------------------------------------------
#!/bin/sh
list="1 2 3 4 5 6 "
for x in $list;
do
now_ip=` ./get_ip.sh -e $2 -s $4`
echo "$x -- $now_ip"done
上 述脚本运行后的结果应该是:

1 -- 192.168.33.36
2 -- 192.168.33.37
3 -- 192.168.33.38
4 -- 192.168.33.39
5 -- 192.168.33.40
6 -- 192.168.33.41

2. 现要求实现get_ip.sh的功能
还有另几个要求:
(1) get_ip.sh返回的地址,要确认是否在 ip_list.txt中存在
( 2 ) get_ip.sh对 ip_list.txt中的非法ip 通知输出。ip_list.txt中的ip地址从192.168.33.36-192.168.33.183

先看效果:

[root@mail tmp]# ./runplayload.sh iplist.txt -s 192.168.33.34-40
No such ip【192.168.33.35】 in 【iplist.txt】
1--192.168.33.34
2--192.168.33.36
3--192.168.33.37
4--192.168.33.38
5--192.168.33.39
6--192.168.33.40
[root@mail tmp]# ./runplayload.sh iplist.txt -s 192.168.33.34-192.168.33.40
No such ip【192.168.33.35】 in 【iplist.txt】
1--192.168.33.34
2--192.168.33.36
3--192.168.33.37
4--192.168.33.38
5--192.168.33.39
6--192.168.33.40
[root@mail tmp]#


看一下iplist.txt文本格式

[root@mail tmp]# cat iplist.txt
192.168.33.34
192.168.33.36-192.168.33.40
192.168.33.200
192.168.33.204-210
192.168.33.231


脚本正圆慎文:

#!/bin/bash
#------------------------------------------
# Copyritht (C),   2015 gamjem@126.com
# 脚本名:   皮咐    
# 脚本位置:     
# 脚本用途: 
# 脚本修改历史:
# < 作者 >      <日期>      <版本>      <描述>
#   老耿      2015/07/13   1.0        创建
#版权:  GPL
#-------------------------------------------
. /root/.bash_profile
#定义ip个数
r=6
#传参 判断
echo $3|grep -q "[0-9]-[0-9]"; stat=$?   #这里在逻辑上应该先判断存不存在$3
if [ $# -ne 3 -o "$2" != "-s" -o ${stat} -ne 0 ]; then
if [ $stat -ne 0 ];then
echo "脚本使用说明: 
COMMAND 文件名  -s  ip范围
例:sh ./run_playload.sh  iplist.txt -s 192.168.33.20-50
或 sh ./run_playload.sh  iplist.txt -s 192.168.33.20-192.168.33.50"
exit
fi
fi
if [ ! -f $1 ];then
echo "文件【$1】不存在!"
exit
fi
#iplist.txt 文件格式转换
iplist=`cat $1|awk -F'[-.]' '{  if($0~/-/){sub(/-.*$/,"",$4);for (i=$4;i<=$NF;i++){print $1"."$2"."$3"."i}}  else print $0} '`
#xx.xx.xx  ipv4前三个字节
ip1="`echo $3|sed -r 's/.[0-9]+-.*$//'`"
#起始ip 最后一个字节
ip2="`echo $3|awk -F'.' '{sub(/-.*$/,"",$4);print $4}'`"
#结束ip 最后一个字节
ip3="`echo $3|awk -F'[-.]' '{print $NF}'`"
#如果起始ip 大于 结束ip,则两个互换
if (( $ip2>$ip3 )) ;then
   ip_tmp=$ip2
   ip2=$ip3
   ip3=$ip_tmp
fi
#合并完整的ip,存在ip()里
ip=()
for i in `seq ${ip2} ${ip3}`
do
  ipp="${ip1}.${i}"  
  echo "${iplist}"|grep -wq "${ipp}" 
  if [ $? -ne 0 ] ; then
    echo "No such ip【${ipp}】 in 【$1】" 
  else
  ip=(${ip[*]} ${ipp})
  fi
done
#判断ip()不为空的情况
if [ -n "${ip[*]}" ];then
#定义ip个数
#r=6
#判断ip取值个数,分两种情况处理
  if (( ${r} <= ${#ip[@]} )); then
      for i in `seq ${r}`
      do
        let j=$i-1
        echo "${i}--${ip[j]}"
      done
   else 
     for ((i=0;i<${#ip[@]};i++))
     do
let j=$i+1
echo "${j}--${ip[i]}"
     done
   燃腔纯  echo "WARNING: 受范围限制,未能取到完整的${r}个ip!"
  fi
fi