如何使用Telnet获取网页内容?
例如, 的内容https://stackoverflow.com/questions
。
你可以做
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
...
远程登录服务器名称 80
GET /index.html↵
↵
↵ 表示“返回”,您需要按两次返回
对于后代,您的问题是如何将 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 响应。
为了稍微扩展早期的答案,有一些复杂性。
telnet
不是特别可编写脚本的;您可能更喜欢使用nc
(aka netcat
),它可以更好地处理非终端输入和信号。
此外,与 不同的是telnet
,nc
实际上允许 SSL(因此https
而不是http
流量——那么您需要端口 443 而不是端口 80)。
HTTP 1.0 和 1.1 之间存在差异。最新版本的协议要求Host:
标头包含在请求中的POST
orGET
行之后的单独行中,并且后跟一个空行以标记请求标头的结束。
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 相同;唯一真正的区别在于最初如何设置会话。