如何在不使用CURL的情况下运行HTTP请求

30

我有一个基于ARM架构的Busybox(嵌入式Linux),但其二进制文件很有限。如何在不使用curl的情况下进行HTTP POST或PUT请求?


1
请检查您是否拥有wget,它提供了一些类似的功能,但实际上,您应该告诉我们更多关于您的项目规格。请编辑您的问题,不要在评论中回复。此外,由于这不是解决“if/then/else/endif”类型编码问题的内容,因此可能会被关闭。在StackExchange上的相关网站http://softwarerecs.stackexchange.com或http://unix.stackexchange.com可能是更好的提问地点。祝你好运! - shellter
3个回答

21

busybox自带wget,但其功能有限且不适合用于发布。您可以将busyboxnetcat(或nc)结合使用以实现结果。您只需要为您的平台下载netcat二进制文件即可。然后就可以开始了:

POST_PATH="/login.cgi"
HOST=199.188.1.99
BODY="Put here HTML body...."
BODY_LEN=$( echo -n "${BODY}" | wc -c )
echo -ne "POST ${POST_PATH} HTTP/1.0\r\nHost: ${HOST}\r\nContent-Type: application/x-www-form-urlencoded\r\nContent-Length: ${BODY_LEN}\r\n\r\n${BODY}" | \
  nc -i 3 ${HOST} 80

基于使用netcat发送HTTP POST请求文章。


2022年更新:Busybox现在也有一个netcat小应用程序 https://github.com/mirror/busybox/blob/master/networking/nc.c - Axel Fontaine
2023年更新:请参考Sandip的答案。从Busybox 1.35.0开始,会更容易。 - Axel Fontaine
另外,关于2023年的更新:可能仍然需要这个PUT请求,因为BusyBox 1.35.0版本的wget仍然只支持POST请求。 - ms-ati
但是busybox nc解决方案有没有一种方法可以通过SSL连接到HTTPS主机? - ms-ati
@ms-ati,**nc可以通过TCP连接到服务器,但无法协商SSL/TLS连接。您应该使用curl/wget来处理HTTPS。或者更加原始的方式是使用OpenSSLs_client代替nc**,例如:echo -ne "GET /not_exist HTTP/1.0\r\n\r\n" | openssl s_client -quiet google.com:443 - SergA

5

我有和你一样的问题,于是我决定从alpine创建最小化的镜像,比busy box做的更多但比ubuntu少。

https://hub.docker.com/r/prima101112/palugada

你可以在pod或容器内使用curl、traceroute甚至vim进行编辑。

或者如果你还想继续使用busybox,通常我会选择:

kubectl exec -it busybox -- wget {url}
kubectl exec -it busybox -- cat index.html

该命令将显示响应。

希望这能帮到你。


这可能是一个很好的评论,但不是一个答案。请阅读规则。 - dpapadopoulos
是的,抱歉,我的错。我已经编辑了评论。谢谢。 - prima.adi

1
使用wget --post-data "xxx" -q $URL向URL发出POST请求,其中xxx是要发送的数据。

这应该是从Busybox 1.35.0开始被接受的起点。 - Axel Fontaine

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接