80

如何使用Telnet获取网页内容?

例如, 的内容https://stackoverflow.com/questions

4

4 回答 4

100

你可以做

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
...
于 2013-04-02T19:22:51.857 回答
57

远程登录服务器名称 80


GET /index.html↵
↵

↵ 表示“返回”,您需要按两次返回

于 2013-04-02T19:14:16.883 回答
46

对于后代,您的问题是如何将 http 请求发送到https://stackoverflow.com/questions. 真正的答案是:您不能使用 telnet,因为这是一个仅 https 可访问的 url。

因此,您可能想使用openssl而不是telnet,例如这样

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

这将为您提供 https 响应。

于 2017-07-05T14:53:11.633 回答
11

为了稍微扩展早期的答案,有一些复杂性。

telnet不是特别可编写脚本的;您可能更喜欢使用nc(aka netcat),它可以更好地处理非终端输入和信号。

此外,与 不同的是telnetnc实际上允许 SSL(因此https而不是http流量——那么您需要端口 443 而不是端口 80)。

HTTP 1.0 和 1.1 之间存在差异。最新版本的协议要求Host:标头包含在请求中的POSTorGET行之后的单独行中,并且后跟一个空行以标记请求标头的结束。

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 相同;唯一真正的区别在于最初如何设置会话。

于 2018-11-08T10:56:49.397 回答