不使用 curl 发送 HTTP 请求:Bash /dev/tcp 原理解析

你正处于一个精简版的 Docker 容器中。 你需要检查一个 API 端点。 你输入 curl,却得到 "command not found"。 你尝试使用 wget,结果也报同样的错误。

无需惊慌。 Bash 的核心内置了一个隐藏功能。 它被称为 /dev/tcp

该功能允许你在不安装任何工具的情况下打开原始 TCP 连接。 它几乎适用于任何 Linux 系统。

工作原理: 当你引用 /dev/tcp/hostname/port 时,Bash 会打开一个套接字(socket)连接。 这是一个 Bash 特有的功能。 它在 shzsh 中无法工作。

魔法命令: exec 3<>/dev/tcp/hostname/port

这行代码打开了一个双向文件描述符。 你可以向其写入数据并读取返回的响应。

GET 请求示例:

#!/bin/bash
exec 3<>/dev/tcp/example.com/80
printf "GET / HTTP/1.1\r\nHost: example.com\r\nConnection: close\r\n\r\n" >&3
cat <&3
exec 3>&-

为什么这很有用: • 在无法安装软件包的极简环境中进行调试。 • 在零依赖的 CI/CD 流水线中运行健康检查。 • 在嵌入式系统上测试连通性。 • 深入学习 HTTP 标头(headers)的具体工作原理。

需要记住的重要限制: • 不支持 HTTPS:Bash 无法处理 TLS/SSL 加密。对于加密流量,请使用 openssl s_client。 • 不支持重定向:你必须手动处理它们。 • 不要过度复杂化:不要将其用于生产环境的 HTTP 客户端。请使用 curl

请务必包含 Connection: close 标头。 如果你忘记了,你的脚本可能会在等待服务器响应时挂起。

下次当你被困在受限的服务器中时,请使用这个技巧。 它能将死胡同变成一个实用的工具。

来源:https://dev.to/onsen/http-requests-without-curl-bash-devtcp-explained-5852

可选学习社区:https://t.me/GyaanSetuAi