直接用 bash 的 /dev/tcp/ip/port 可测端口通断,无需安装 telnet、curl、nc 等工具,依赖 bash 编译时启用 enable-dev(主流发行版默认开启),通过 socket()+connect() 实现毫秒级连通性测试,支持超时控制、域名解析和脚本批量探测,零依赖、轻量、可靠。

直接用 Bash 的 /dev/tcp/ip/port 就能测端口通不通,不需要安装 telnet、curl、nc 等任何额外工具,纯系统原生能力,轻量又可靠。
原理很简单:Bash 自带 TCP 重定向支持
Bash 在编译时若启用了 enable-dev(主流发行版默认开启),就支持以文件形式访问网络连接。虽然 /dev/tcp 并非真实设备节点(ls /dev/tcp 会报错),但它是一种语法糖——当你写 /dev/tcp/192.168.1.100/22,Bash 会在后台调用 socket() + connect(),成功则返回 0,失败则返回非 0 状态码。
这个过程不依赖用户态工具,不走外部进程,毫秒级响应,适合脚本批量探测。
单个端口快速探测的写法
最简形式就是一条重定向加命令执行:
timeout 3 bash -c "cat /dev/null && echo "UP" || echo "DOWN"-
if timeout 2 bash -c ":/dev/null; then echo "HTTPS open"; fi
注意点:
-
timeout必须加,否则遇到防火墙丢包或无响应主机可能卡住几秒甚至更久 - 用
:或cat做占位命令即可,不真传数据,只测试连通性 - 错误输出重定向到
/dev/null避免干扰判断 - 域名会被自动解析,无需提前
nslookup
批量探测多个 IP 和端口
把逻辑封装成函数,配合循环就能轻松扩展:
<pre class="brush:php;toolbar:false;">check_port() {
local host=$1 port=$2
if timeout 1.5 bash -c ": /dev/null; then
printf "%-15s:%-5d \033[32mOK\033[0m\n" "$host" "$port"
else
printf "%-15s:%-5d \033[31mFAIL\033[0m\n" "$host" "$port"
fi
}
使用示例
check_port 192.168.1.1 22 check_port api.example.com 443 check_port 10.10.10.100 3306
如需并发探测,可用 & 后台启动 + wait 控制,避免阻塞。实际生产中建议限制并发数(比如最多 20 路),防止本地端口耗尽或触发远端限流。
和常见工具对比的关键优势
为什么值得优先用它:
- 零依赖:CentOS/RHEL/Alpine/Debian 默认 Bash 都支持,容器镜像里也常驻
-
极快启动:无子进程 fork 开销,比
nc -z或telnet快 3–5 倍 -
可嵌入任意上下文:能放进
if、while、CI 脚本、systemd ExecStartPre 中直接用 -
权限友好:普通用户即可运行,不像
ss或lsof有时需 root 查监听状态
局限也很明确:只能做主动 connect 测试(即模拟客户端行为),不能扫描监听状态,也不能查本机哪个进程占了端口——那是 ss -tuln 或 lsof -i 的事。











