一、需求说明

  有时候系统故障我们需要验证局域网内的主机是否开放某个端口;又或者互联网报到某软件漏洞涉及到某个端口,我们需要批量检查局域网中哪些主机开放了此端口;又或者我们需要检查指定列表主机都开放了哪些端口?我们可以通过脚本来完成这些工作,便捷、高效。

二、脚本内容

#!/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和端口参数执行

shell 脚本查看springboot项目tcp端口 shell命令查看tcp端口_端口扫描

2、带IP参数执行

shell 脚本查看springboot项目tcp端口 shell命令查看tcp端口_端口检查_02

3、扫描主机列表的指定端口

shell 脚本查看springboot项目tcp端口 shell命令查看tcp端口_shell脚本_03

4、扫描主机列表的常见应用端口

shell 脚本查看springboot项目tcp端口 shell命令查看tcp端口_安全检查_04

5、扫描主机列表的端口范围

shell 脚本查看springboot项目tcp端口 shell命令查看tcp端口_安全检查_05

6、扫描列表为空时

shell 脚本查看springboot项目tcp端口 shell命令查看tcp端口_端口检查_06

7、检查域名主机端口是否开放

shell 脚本查看springboot项目tcp端口 shell命令查看tcp端口_端口检查_07