随机获取开放指定端口的ip地址并保存
出于练手的目的,写了一个获取开放指定端口号ip的脚本,脚本核心基于强大的nmap工具,然后结果用sed过滤出ip,最终显示到终端,并且保存至文本文件。所以,要运行该脚本,必须先安装nmap软件。
**整个脚本内容如下**:
```language
#!/bin/bash
get_threads_num(){
ps -ef|grep "nmap -iR"|grep -v "grep"|wc -l
}
get_ip(){
nmap -iR $num -p $ports --open -Pn --max-hostgroup $hosts --max-parallelism $conns $args|sed -nr -e 's/.*[^0-9]+(([0-9]{1,3}\.){3}[0-9]{1,3}).*/\1/p' -e 's/([0-9]{1,5})\/.*/\1/p'
}
save(){
while read line
do
if ! [[ "$line" =~ ^[0-9]{1,5}$ ]];then
echo
echo "##${sum}th scanning."
ip=$line
echo -n $ip" "
continue
else
port=$line
echo -n $port" "
echo $ip >> $port.txt
fi
done
}
run(){
while true
do
while (( `get_threads_num` < threads ))
do
((sum++))
{
get_ip|save
}&
done
sleep 1
done
}
usage(){
cat <<-EOF
usage:$0 <--ports PORTS> [options]...
options:
--num the scan-ip numbers in every process.
--threads the total processes of nmap scan.
--hosts the max hosts numbers in every nmap scan.
--conns the max total connections in per nmap scan.
--ports the ports which will be scanned.
--help print this help messages.
--stop kill all processes.
EOF
}
num=100
sum=0
threads=10
args=""
hosts=100
conns=100
while true
do
case "$1" in
--num)
num=$2
shift 2
;;
--ports)
ports=$2
shift 2
;;
--threads)
threads=$2
shift 2
;;
--hosts)
hosts=$2
shift 2
;;
--conns)
conns=$2
shift 2
;;
--stop)
pkill `basename $0`
shift
;;
--help)
usage
exit
;;
--*)
args=$args" "$1" "$2
shift 2
;;
*)
break
;;
esac
done
if ! [[ $ports ]];then
echo "You must specify --ports options."
usage
exit
fi
clear
trap "pkill `basename $0`" 2
run
```
**脚本功能:**
使用nmap扫描互联网指定端口号,以端口号为文件名保存开放该端口号的ip,每个ip一行,同时将结果输出到终端。
直接运行该脚本,可见如下结果:
![图片.png](http://www.icode9.com/i/li/?n=2&i=images/20210628/1624856984407032.png?,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
**参数说明:**
--ports:指明需要扫描的端口号(必须指定的参数,与nmap格式相同)
--num:在同一nmap进程内同时扫描的ip个数(默认值100)
--threads:同时运行的nmap进程个数(默认值10)
--hosts:每个nmap进程同时扫描的主机数量(默认值100)
--conns:每个nmap进程最大连接数(默认值100)
--stop:结束所有nmap扫描进程
--help:打印帮助信息
**应用举例:**
./scan-ips.sh --ports 21-23
终端输出:
![图片.png](http://www.icode9.com/i/li/?n=2&i=images/20210628/1624857844441862.png?,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
同时在当前目录下生成21.txt,22.txt,23.txt三个文本文件,记录开放对应端口ip