如何使用netcat手动进行HTTP GET请求?

71

因此,我需要从http://www.rssweather.com/dir/Asia/India中的任何一个城市检索温度。

假设我想检索坎普尔的温度。

如何使用Netcat进行HTTP GET请求?

我正在执行类似于这样的操作。

nc -v rssweather.com 80
GET http://www.rssweather.com/wx/in/kanpur/wx.php HTTP/1.1

我不确定自己是否朝着正确的方向前进。我找不到任何关于如何使用 netcat 发送 HTTP GET 请求的好教程,所以我在这里发布。


1
这不是一个正式的答案,但我建议使用curlwget来完成这种事情。 - ki9
6个回答

53

当然,您可以在Google中搜索标准,但实际上,如果您只想获取单个URL,则这并不值得花费这样的努力。

您还可以在端口上启动netcat以侦听模式:

nc -l 64738

有时候nc -l -p 64738是正确的参数列表。

...然后使用真正的浏览器请求该端口。只需在浏览器中输入http://localhost:64738即可查看。

在您的情况下,问题在于HTTP/1.1不会自动关闭连接,而是等待您要检索的下一个URL。解决方案很简单:

使用HTTP/1.0:

GET /this/url/you/want/to/get HTTP/1.0
Host: www.rssweather.com
<empty line>

或者使用一个Connection:请求头来告诉服务器你想要在此之后关闭:

GET /this/url/you/want/to/get HTTP/1.1
Host: www.rssweather.com
Connection: close
<empty line>

扩展:在GET请求头之后,只写请求的路径部分。你想获取数据的主机名属于一个Host:头,正如你可以看到我提供的示例。这是因为多个网站可以运行在同一台Web服务器上,所以浏览器需要告诉它从哪个站点加载页面。


谢谢。这很有帮助。现在结果已经从错误的请求改变成为禁止访问。服务器不允许我访问该文件。有什么方法可以修复它吗?HTTP/1.1 403 Forbidden Date: Tue, 01 Sep 2015 22:14:50 GMT Server: Apache Connection: close Content-Type: text/html; charset=iso-8859-1<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <HTML><HEAD> <TITLE>403 Forbidden</TITLE> </HEAD><BODY> <H1>Forbidden</H1> 您无权访问 /wx/in/kanpur/wx.php <P> <HR> <ADDRESS>Apache/1.3.41 服务器于 www.rssweather.com 的80端口上运行</ADDRESS> </BODY></HTML> - Avinash Bhawnani
@AvinashBhawnani 谢谢。您可以随时编辑您的问题,而且在评论中长时间复制粘贴看起来不太好。在类似情况下,最好将它们编辑到您的问题中。如果您有另一个问题,可以在新问题中提出,这在这里不是问题(只要您不重复提出相同的问题)。 - peterh

31

您甚至不需要使用/安装netcat

  • 通过未使用的文件描述符创建TCP套接字,例如我在这里使用88
  • 将请求写入其中
  • 使用该文件描述符

exec 88<>/dev/tcp/rssweather.com/80
echo -e "GET /dir/Asia/India HTTP/1.1\nhost: www.rssweather.com\nConnection: close\n\n" >&88
sed 's/<[^>]*>/ /g' <&88

这是什么?我的Debian没有这个“tcp”目录,但点赞数表明它实际上是有效的。此外,exec由Bash提供。 - WGRM
据我所知,Debian的Bash没有这个附加组件,原因是因为它存在一些缺陷。 - undefined
@peterh 这个叫什么名字?有项目页面吗? - undefined
@WGRM 这不是一个独立的项目,而是bash shell的一部分。Debian在没有任何可接受的理由的情况下关闭了这个功能。因此,在你的Debian系统中,bash无法发起网络连接,就是这样。 - undefined
@peterh 好的,我稍后会查看。谢谢。 - undefined

30

这对我有效:

$ nc www.rssweather.com 80
GET /wx/in/kanpur/wx.php HTTP/1.0
Host: www.rssweather.com

然后连续按两次 <enter> 键,一次是为了远程 HTTP 服务器,另一次是为了 nc 命令。

来源:PentesterLab


3
你应该使用 HTTP/1.0,或者也可以添加一个 Connection: close 头部。 - peterh
1
如果你收到了“HTTP/1.1 426 Upgrade Required”的错误提示,尝试将HTTP/1.0更改为HTTP/1.1。 - sotiris
这对我有用。按两次<enter>键就行了。 - sriram

18

在MacOS上,您需要使用以下-c标志:

Little-Net:~ minfrin$ nc -c rssweather.com 80
GET /wx/in/kanpur/wx.php HTTP/1.1
Host: rssweather.com
Connection: close
[empty line]

响应结果如下:

HTTP/1.1 200 OK
Date: Thu, 23 Aug 2018 13:20:49 GMT
Server: Apache
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html

“-c”标志被描述为“将CRLF作为行尾发送”。

为了符合HTTP/1.1标准,您需要Host标头,以及“Connection: close”如果您想禁用持久连接。


2
这里需要加上Linux中的大写字母“-C”,否则以上建议将无法正常工作。 - pevogam

11

使用python3 http.server在本地测试它

这也是一个有趣的测试方法。在一个终端窗口中,启动一个本地文件服务器:

python3 -m http.server 8000

然后在第二个shell中发出请求:

printf 'GET / HTTP/1.1\r\nHost: localhost\r\n\r\n' | nc localhost 8000

Host: 头在HTTP 1.1中是必需的。

这显示了一个目录的HTML清单,就像你从以下位置看到的一样:

firefox http://localhost:8000

接下来,您可以尝试列出文件和目录并观察响应:

printf 'GET /my-subdir/ HTTP/1.1\n\n' | nc localhost 8000
printf 'GET /my-file HTTP/1.1\n\n' | nc localhost 8000

每次您成功发出请求时,服务器会输出:

127.0.0.1 - - [05/Oct/2018 11:20:55] "GET / HTTP/1.1" 200 -

确认已收到。

example.com

这个由互联网编号分配机构(IANA)维护的域名是另一个很好的测试URL:

printf 'GET / HTTP/1.1\r\nHost: example.com\r\n\r\n' | nc example.com 80

并与之比较:http://example.com/

https SSL

nc 似乎无法处理 https URL。相反,您可以使用:

sudo apt-get install nmap
printf 'GET / HTTP/1.1\r\nHost: github.com\r\n\r\n' | ncat --ssl github.com 443

另请参阅:https://serverfault.com/questions/102032/connecting-to-https-with-netcat-nc/650189#650189

如果您尝试使用nc,它会一直挂起:

printf 'GET / HTTP/1.1\r\nHost: github.com\r\n\r\n' | nc github.com 443

尝试转移80端口:

printf 'GET / HTTP/1.1\r\nHost: github.com\r\n\r\n' | nc github.com 443

仅会给出一个重定向响应到 https 版本:

HTTP/1.1 301 Moved Permanently
Content-Length: 0
Location: https://github.com/
Connection: keep-alive

在Ubuntu 18.04上进行了测试。


0
使用nc连接后,只需要指定路径,无需再次指定主机名。

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