如何使用Telnet获取网页内容? (例如https://stackoverflow.com/questions页面的内容)
答案 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:
标头必须包含在请求中,位于POST
或GET
行之后的单独行中,并在其后跟随一个空行以标记请求标头的末尾。
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相同。唯一真正的区别是会话的最初设置方式。