如何使用Telnet发送HTTP请求

时间:2013-04-02 19:10:49

标签: web telnet

如何使用Telnet获取网页内容? (例如https://stackoverflow.com/questions页面的内容)

4 个答案:

答案 0 :(得分:62)

你可以做到

telnet stackoverflow.com 80

然后粘贴

GET /questions HTTP/1.0
Host: stackoverflow.com


# add the 2 empty lines above but not this one

这是一份成绩单

$ telnet stackoverflow.com 80
Trying 151.101.65.69...
Connected to stackoverflow.com.
Escape character is '^]'.
GET /questions HTTP/1.0
Host: stackoverflow.com

HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
...

答案 1 :(得分:28)

telnet ServerName 80


GET /index.html

答案 2 :(得分:24)

对于后代,您的问题是如何向https://stackoverflow.com/questions发送http请求。真正的答案是:你不能用telnet,因为这是一个只有https的可达网址。

因此,您可能希望使用openssl代替telnet,例如

$ openssl s_client -connect stackoverflow.com:443
...
---
GET /questions HTTP/1.1
Host: stackoverflow.com

这将为您提供https响应。

答案 3 :(得分:2)

要对先前的答案进行一些扩展,会带来一些麻烦。

telnet并不是特别可编写脚本的脚本;您可能更喜欢使用nc(也称为netcat)来处理非终端输入并更好地发出信号。

此外,与telnet不同,nc实际上允许SSL(因此https而不是http流量-您需要端口443而不是端口80)。 / p>

HTTP 1.0和1.1之间有区别。该协议的最新版本要求Host:标头必须包含在请求中,位于POSTGET行之后的单独行中,并在其后跟随一个空行以标记请求标头的末尾。

HTTP协议要求回车/换行结束。许多服务器对此宽容,但有些则不然。您可能要使用

printf "%\r\n" \
    "GET /questions HTTP/1.1" \
    "Host: stackoverflow.com" \
    "" |
nc --ssl stackoverflow.com 443

如果您退回到HTTP / 1.0,则不一定总是需要Host:标头,但是无论如何,许多现代服务器都需要标头。如果多个站点托管在同一个IP地址上,则服务器无法从GET /foo HTTP/1.0得知您是指http://site1.example.com/foo还是http://site2.example.net/foo这两个站点都托管在同一服务器上(在由于缺少Host:标头,因此HTTP 1.0服务器可能只是默认使用与所需站点不同的站点,因此不会获得所需的内容。

在这些细节上,HTTPS协议与HTTP相同。唯一真正的区别是会话的最初设置方式。