shell脚本配合nc是最轻量通用的端口检测方式,通过读取ip列表循环执行nc -zv检测连通性,支持单端口批量扫描、多端口嵌套扫描及本地监听端口查询。

直接用 Shell 脚本配合 nc(netcat)是最轻量、最通用的方式,无需安装额外扫描工具,也规避了 nmap 的合规风险。核心思路是:读取 IP 列表 + 循环调用 nc -zv 检测连通性 + 按需扩展端口和颜色输出。
用 nc 批量检查单个端口对多台主机
适合快速验证如 SSH(22)、HTTP(80)等关键端口是否可达。
准备一个 hosts.txt,每行一个 IP:
192.168.1.10 192.168.1.11 192.168.1.12
执行以下脚本(保存为 check_port.sh):
#!/bin/bash
PORT=${1:-22} # 默认检查 22 端口,可传参指定,如 ./check_port.sh 8080
while IFS= read -r ip; do
if [ -n "$ip" ]; then
if nc -zvw3 "$ip" "$PORT" >/dev/null 2>&1; then
echo -e "\033[32m$ip:$PORT\t✅ 开放\033[0m"
else
echo -e "\033[31m$ip:$PORT\t❌ 关闭或不可达\033[0m"
fi
fi
done <p>运行命令:<code>chmod +x check_port.sh && ./check_port.sh 80</code></p><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill8828" title="Obsidian (Linux)"><img
src="https://img.php.cn/upload/skill/000/000/081/179228531040284.jpg" alt="Obsidian (Linux)" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/xiazai/skill8828" title="Obsidian (Linux)" class="overflowclass">Obsidian (Linux)</a>
<p class="overflowclass">操作 Obsidian 库(纯 Markdown 笔记),并通过 notesmd-cli 实现自动化。</p>
</div>
<a rel="nofollow" href="/xiazai/skill8828" title="Obsidian (Linux)" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div><h3>批量检查多个端口对多台主机</h3><p>适合运维验收或服务健康巡检。把目标端口写成数组,嵌套循环即可: </p><pre class="brush:bash;toolbar:false;">#!/bin/bash
PORTS=(22 80 443 8080)
while IFS= read -r ip; do
[ -z "$ip" ] && continue
echo "=== $ip ==="
for port in "${PORTS[@]}"; do
if nc -zvw2 "$ip" "$port" >/dev/null 2>&1; then
printf "%-5s: \033[32mOK\033[0m\n" "$port"
else
printf "%-5s: \033[31mFAIL\033[0m\n" "$port"
fi
done
done <h3>检查本机哪些端口正在监听(不依赖远程连通)</h3><p>用 <code>ss</code> 或 <code>netstat</code> 查本地服务状态,更准确反映服务是否真正启动: </p><pre class="brush:bash;toolbar:false;"># 查本机所有监听的 TCP 端口(推荐 ss,更快)
ss -tuln | awk '{print $5}' | cut -d':' -f2 | sort -nu
# 查指定端口是否被监听(例如 3306)
ss -tuln | grep ':3306' >/dev/null && echo "MySQL 端口已监听" || echo "未监听"
# 同时显示占用进程(需 root 权限才完整)
ss -tulnp 2>/dev/null | grep ':80'注意事项和优化建议
-
nc -zvw3中-z表示只扫描不发数据,-v输出详情,-w3是 3 秒超时,避免卡住 - 若目标主机禁 ping 或防火墙拦截,
nc连不通 ≠ 服务没启,只是网络层不通;此时应结合ssh user@ip 'ss -tuln | grep :端口'远程查监听状态 - 生产环境建议加
timeout 5包裹nc命令,防个别主机响应异常拖慢整体速度 - 输出结果可重定向保存:
./check_port.sh 22 > report_22.log 2>&1
不复杂但容易忽略。










