不使用 curl 发送 HTTP 请求:Bash /dev/tcp 原理解析
你正处于一个精简版的 Docker 容器中。
你需要检查一个 API 端点。
你输入 curl,却得到 "command not found"。
你尝试使用 wget,结果也报同样的错误。
无需惊慌。
Bash 的核心内置了一个隐藏功能。
它被称为 /dev/tcp。
该功能允许你在不安装任何工具的情况下打开原始 TCP 连接。 它几乎适用于任何 Linux 系统。
工作原理:
当你引用 /dev/tcp/hostname/port 时,Bash 会打开一个套接字(socket)连接。
这是一个 Bash 特有的功能。
它在 sh 或 zsh 中无法工作。
魔法命令:
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