以下是一个使用 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实现。