bash内置/dev/tcp可测端口连通性及读取banner,无需额外工具,适用于容器、精简系统及国产os;需先验证支持性,再用echo>/dev/tcp/host/port或exec配合timeout使用。

直接用 Bash 内置的 /dev/tcp 伪设备就能测,无需安装任何额外工具,适合容器、精简系统或国产操作系统(如统信UOS、麒麟KOS)环境。
确认 Bash 是否支持 /dev/tcp
执行以下命令验证:
bash -c "echo > /dev/tcp/127.0.0.1/22" 2>/dev/null && echo "支持" || echo "不支持"
若输出“支持”,说明当前 Bash 编译时启用了 --enable-net-redirections,可放心使用。Debian/Ubuntu 某些极简镜像可能默认禁用,需提前确认。
单端口连通性测试(最常用)
语法简洁,靠命令退出状态判断:
echo > /dev/tcp/example.com/80 && echo "开放" || echo "关闭或不可达"-
timeout 3 bash -c "echo > /dev/tcp/192.168.1.100/3306" 2>/dev/null && echo "MySQL端口可达"(加timeout防卡死) - 失败时常见报错:
Connection refused(服务未监听)、No route to host(网络不通)、Name or service not known(DNS失败)
读取服务 Banner(如 HTTP、SSH、SMTP)
建立连接后发送简单请求并读响应:
exec 3 /dev/tcp/example.com/80 && echo -e "HEAD / HTTP/1.0\r\nHost: example.com\r\n\r\n" >&3 && head -n 10
说明:
-
exec 3 /dev/tcp/...打开双向文件描述符 3 -
echo -e "... " >&3发送 HTTP 请求头(注意\r\n换行) head -n 10 读取前 10 行响应(含状态行和 Server 字段)exec 3 关闭连接
批量扫描多个端口(简易脚本思路)
可写成循环,配合 timeout 控制单次尝试时长:
for port in 22 80 443 8080; do timeout 2 bash -c "echo > /dev/tcp/target-host/$port" 2>/dev/null && echo "$port: open"; done
注意:
- 不建议扫描大量端口(无并发、无超时控制易卡顿)
- 真实生产环境仍推荐
nmap或nc -zv;此方法定位为“应急可用、零依赖”场景 -
/dev/udp同理可用,但 UDP 无连接特性导致检测可靠性低于 TCP











