Linux没有curl和wget怎么发送http请求?
在某些Linux环境中,默认可能没有安装curl
或wget
,可能也无法快速安装这两个命令,比如离线环境,服务器没有网络,然而我们依然可以通过其他方式发送HTTP请求。
本文将详细介绍两种无需依赖curl
和wget
的请求发送方法。
方案一
在Linux中,Bash脚本提供了非常强大的能力,借助TCP套接字功能,可以直接向服务器发送HTTP请求,而无需curl
或wget
。
发送GET请求
以下脚本使用Bash和TCP套接字直接发送GET请求。脚本创建与目标服务器的TCP连接,构建HTTP请求,并输出响应结果。
#!/bin/bash
# 打开一个 TCP 连接到 postman-echo.com 的 80 端口,并将其分配给文件描述符 3
exec 3<>/dev/tcp/postman-echo.com/80
# 构建带有查询参数的GET请求
echo -ne "GET /get?param1=value1¶m2=value2 HTTP/1.1\r\nHost: postman-echo.com\r\nConnection: close\r\n\r\n" >&3
# 从文件描述符 3 读取响应并输出到标准输出
cat <&3
# 关闭文件描述符 3
exec 3<&-
该脚本通过TCP连接发送GET请求并获取响应结果,模拟了类似curl
的GET请求操作。
效果预览
当运行上面的脚本时,返回结果会类似于:
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 453
Connection: close
...
{
"args": {
"param1": "value1",
"param2": "value2"
},
...
}
POST请求
同样的,通过Bash脚本我们也可以发送POST请求。
#!/bin/bash
# 打开一个 TCP 连接到 postman-echo.com 的 80 端口,并将其分配给文件描述符 3
exec 3<>/dev/tcp/postman-echo.com/80
# POST 数据
data="param1=value1¶m2=value2"
# 构建 HTTP 请求并发送到文件描述符 3
echo -ne "POST /post HTTP/1.1\r\n" >&3
echo -ne "Host: postman-echo.com\r\n" >&3
echo -ne "Content-Type: application/x-www-form-urlencoded\r\n" >&3
echo -ne "Content-Length: ${#data}\r\n" >&3
echo -ne "Connection: close\r\n\r\n" >&3
echo -ne "$data" >&3
# 从文件描述符 3 读取响应并输出到标准输出
cat <&3
# 关闭文件描述符 3
exec 3<&-
此脚本发送POST请求并输出返回的结果,类似于使用curl -d
的效果。
效果预览
运行POST请求脚本后的返回数据:
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 453
Connection: close
...
{
"data": {
"param1": "value1",
"param2": "value2"
},
...
}
方案二
除了Bash脚本,telnet
也是另一种无需curl
或wget
的发送请求方式。telnet
允许你与目标服务器的任意端口进行通信,模拟HTTP请求发送。
使用telnet发送GET请求
1. 通过以下命令连接服务器:
telnet postman-echo.com 80
2. 在连接建立后,手动输入以下内容,并按下两次
Enter
键:GET /get?param1=value1¶m2=value2 HTTP/1.1
Host: postman-echo.com
Connection: close
效果预览
如下图所示,通过telnet
手动发送GET请求后,服务器返回了HTTP响应结果:
通过以上方法在没有curl
或wget
的Linux环境中,你依然可以通过Bash脚本或者telnet
来发送HTTP请求。Bash可以通过TCP套接字发送GET和POST请求,telnet
可以手动模拟HTTP请求。这些方法为那些无法访问网络的环境提供了灵活的替代方案。