开发工具

以下是一个使用 Shell 脚本扫描主机端口状态的详细方法,支持自定义目标主机、端口范围和超时设置,并提供多种实现方式:

方法一:使用 /dev/tcp(纯 Bash 实现)

脚本代码

#!/bin/bash
# 功能:基于Bash的TCP端口扫描工具
# 用法:./port_scan.sh <目标主机> <起始端口> <结束端口> [超时秒数]

host=${1:-"localhost"}   # 目标主机,默认localhost
start=${2:-1}            # 起始端口,默认1
end=${3:-100}            # 结束端口,默认100
timeout=${4:-1}          # 超时时间(秒),默认1秒

# 检查端口开放状态
scan_port() {
    (timeout $timeout bash -c ">/dev/tcp/$host/$1" 2>/dev/null) && return 0 || return 1
}

# 执行扫描
echo "扫描主机 $host 端口范围 $start-$end ..."
for port in $(seq $start $end); do
    if scan_port $port; then
        echo "端口 $port 开放"
    fi
done


使用示例

# 扫描本地主机的1-100端口
./port_scan.sh

# 扫描 example.com 的 80-443 端口,超时2秒
./port_scan.sh example.com 80 443 2



方法二:使用 nc(netcat)

脚本代码

#!/bin/bash
# 功能:基于nc的快速端口扫描
# 依赖:netcat-openbsd或nmap-ncat
# 用法:./nc_scan.sh <目标主机> <端口列表>

host=${1:-"localhost"}
ports=${@:2}  # 支持多个端口(如 80 443 22)

for port in $ports; do
    if nc -zv -w 1 $host $port 2>/dev/null; then
        echo "端口 $port 开放"
    fi
done


使用示例

# 扫描 example.com 的 22,80,443
./nc_scan.sh example.com 22 80 443



方法三:使用 nmap(专业扫描工具)

脚本代码

#!/bin/bash
# 功能:调用nmap进行端口扫描
# 依赖:nmap
# 用法:./nmap_scan.sh <目标主机> [端口范围]

host=${1:-"localhost"}
ports=${2:-"1-1000"}  # 默认扫描1-1000端口

nmap -p $ports $host | awk '/open/ {print "端口", $1, "开放"}'


使用示例

# 快速扫描常用端口
./nmap_scan.sh example.com 1-1024



方法四:并行扫描加速

脚本代码

#!/bin/bash
# 功能:并行扫描端口(使用xargs加速)
# 用法:./fast_scan.sh <目标主机> <起始端口> <结束端口>

host=${1:-"localhost"}
start=${2:-1}
end=${3:-100}

scan_port() {
    port=$1
    (timeout 1 bash -c ">/dev/tcp/$host/$port" 2>/dev/null) && echo "端口 $port 开放"
}

# 使用xargs并行扫描(4线程)
export -f scan_port
export host
seq $start $end | xargs -P4 -I{} bash -c 'scan_port "$@"' _ {}

参数说明

参数描述
目标主机可以是IP或域名(如192.168.1.1)
端口范围单个端口(80)、列表(22,80)或范围(1-1024)
超时时间控制每个端口的检测等待时间(单位:秒)


注意事项

1、权限要求

扫描特权端口(1-1024)可能需要 sudo

nmap 部分功能需要 root 权限(如SYN扫描)


2、工具依赖

安装所需工具:

# Ubuntu/Debian
sudo apt install netcat nmap

# CentOS/RHEL
sudo yum install nc nmap


3、防火墙干扰

目标主机的防火墙可能屏蔽ICMP/UDP探测请求


4、合法性

未经授权扫描他人主机可能违反法律或服务条款



扩展功能

1. 扫描结果输出到文件

./port_scan.sh example.com 1 1000 2 | tee scan_results.txt


2. 检测UDP端口

# 使用nmap扫描UDP端口
nmap -sU -p 53,123,161 example.com


3. 服务版本识别

nmap -sV -p 80,443 example.com  # 显示服务版本信息

通过以上方法,您可以根据需求选择适合的扫描方案。建议优先使用 nmap 获取更专业的扫描结果,而在轻量级任务中选用Bash或nc实现。