一、需求说明
有时候系统故障我们需要验证局域网内的主机是否开放某个端口;又或者互联网报到某软件漏洞涉及到某个端口,我们需要批量检查局域网中哪些主机开放了此端口;又或者我们需要检查指定列表主机都开放了哪些端口?我们可以通过脚本来完成这些工作,便捷、高效。
二、脚本内容
#!/bin/bash
#script name: scan_port.sh
#author: wuhs
#description: Scan whether the host port is open
#参数定义
HOST=localhost
PORTS="22 25 80 443 8080 1521 3306"
HostList=hosts.txt
curdir=`cd -P $(dirname $0); pwd`
echo -e "脚本使用说明:直接输入IP和端口,扫描单个主机特定端口;无参数执行则扫描指定主机列表的指定端口!"
if [ $1 ];then
HOST=$1
if [ $2 ];then
#IP和端口都有输入时直接扫描
PORT=$2
if [ echo &>/dev/null > /dev/tcp/$HOST/$PORT ]; then
echo -e "\e[32m $HOST 端口$PORT 状态为:open \e[0m"
else
echo "$HOST 端口$PORT 状态为:close"
fi
else
#只输入IP参数,则提示需要输入待扫描端口
read -p "未输入端口,请输入你需要扫描的端口:" PORT
if [ echo &>/dev/null > /dev/tcp/$HOST/$PORT ]; then
echo -e "\e[32m $HOST 端口$PORT 状态为:open \e[0m"
else
echo -e "$HOST 端口$PORT 状态为:close"
fi
fi
else
if [ -s $HostList ];then #检查待扫描列表文件是否存在并不为空
cd $curdir
echo "未输入参数执行,扫描hosts.txt文件中列表主机"
echo -e "1、扫描指定端口\n2、扫描默认常见端口列表\n3、扫描指定端口范围\n4、退出:"
read -p "你的选择是:" opt
case $opt in
1)
#扫描列表主机的指定端口
read -p "请输入你需要扫描的端口:" PORT
while read line
do
if [ echo &>/dev/null > /dev/tcp/$line/$PORT ]; then
echo -e "\e[32m $line 端口$PORT 状态为:open \e[0m"
else
echo -e "$line 端口$PORT 状态为:close"
fi
done < hosts.txt
;;
2)
#扫描列表主机的常见应用端口
echo "现在扫描常见应用端口: $PORTS"
while read line
do
for PORT in $PORTS; do
if [ echo &>/dev/null > /dev/tcp/$line/$PORT ]; then
echo -e "\e[32m $line 端口$PORT 状态为:open \e[0m"
else
echo -e "$line 端口$PORT 状态为:close"
fi
done
done < hosts.txt
;;
3)
#扫描列表主机的指定端口范围
read -p "请输入你需要扫描的起始端口号:" FPORT
read -p "请输入你需要扫描的结束端口号:" LPORT
while read line
do
PORT=$FPORT
while ((PORT<=$LPORT))
do
if [ echo &>/dev/null > /dev/tcp/$line/$PORT ]; then
echo -e "\e[32m $line 端口$PORT 状态为:open \e[0m"
else
echo -e "$line 端口$PORT 状态为:close"
fi
let "PORT++"
done
done < hosts.txt
;;
4)
exit
;;
*)
echo "请根据选择输入1,2,3,4,其他输入无效!"
;;
esac
else
#待扫描主机列表为空则退出
echo "待扫描主机列表为空"
exit
fi
fi
三、使用示例
1、带IP和端口参数执行
2、带IP参数执行
3、扫描主机列表的指定端口
4、扫描主机列表的常见应用端口
5、扫描主机列表的端口范围
6、扫描列表为空时
7、检查域名主机端口是否开放