如何使用Telnet发送HTTP请求

如何使用Telnet发送HTTP请求,http,web,telnet,Http,Web,Telnet,如何使用获取网页内容 例如,https://stackoverflow.com/questionstelnet服务器名80 ↵ 表示“返回”,您需要按两次返回键 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

如何使用获取网页内容

例如,
https://stackoverflow.com/questions

telnet服务器名80


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

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
...

对于后代来说,您的问题是如何向
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
(又称
netcat
),它可以更好地处理非终端输入和信号

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

HTTP 1.0和1.1之间存在差异。该协议的最新版本要求请求中在
POST
GET
行之后的单独一行中包含
主机:
标头,并在其后加一空行以标记请求标头的结束

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

printf "%\r\n" \
    "GET /questions HTTP/1.1" \
    "Host: stackoverflow.com" \
    "" |
nc --ssl stackoverflow.com 443
如果您退回到HTTP/1.0,您并不总是需要
主机:
头,但许多现代服务器仍然需要头;如果多个站点托管在同一IP地址上,服务器不知道从
GET/foo HTTP/1.0
您的意思是
http://site1.example.com/foo
http://site2.example.net/foo
如果这两个站点都托管在同一台服务器上(如果没有
主机:
头,HTTP 1.0服务器可能只是默认为与您想要的站点不同的站点,因此您无法获得所需的内容)


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

示例
telnet telehack.com
。如果使用没有dns的设备(例如我正在设置的一些cisco路由器),此注释/示例远远优于最高评级的答案只需先查找IP,然后连接.Hrm,对我来说效果很好(也不需要“接受”标题)。如果执行速度足够快(并且使用与真正浏览器相同的标题)这样,就根本不可能区分CLI请求和来自浏览器的CLI请求。唯一的区别方法是查看更大的上下文(例如,后续请求或没有后续请求,或它们的时间安排,但即使如此,也不是确定的,因为用户可能会使用扩展或设置来禁用外部资源的加载)。行的开头有多余的空格,导致了
HTTP/1.1400错误的请求
响应。我修复了它,并包含了一个抄本。干杯。HTTP/1.0对我不起作用。如果服务器坚持CR/LF行终止,应该是HTTP/1.1吗?还是
nc--ssl stackoverflow.com 443
(根据HTTP协议规范,但经常被忽略)将
-crlf
添加到选项中。@macOS
nc
上的user4104817不能这样做,但是
brew安装nmap
提供了
ncat
命令,该选项必须在
GET/index.html
之后添加两个换行符,否则将无法工作。标题部分的结尾由一个空字段(行)指示,导致两个连续的CR-LF对的传输。-如果要自动执行此操作:
{echo“GET/”;sleep 1;}telnet localhost 80
(从)HTTP/1.0真的没有必要吗?HTTP规范没有将其标记为opcional,但大多数服务器似乎在没有它的情况下工作。这是一种未记录的行为,还是在其他地方记录的行为?下面是netcat的一行代码:
{echo“GET/HTTP/1.1”;echo“Host:example.com”;echo;sleep 1;}|ncat--ssl example.com 443
我真的看不出比
printf
有什么优势。也许
sleep
在某些情况下有帮助。我认为这没关系,我想
printf
可以做更多的事情,但是
echo
在这种情况下就足够了。我只是觉得与netcat共享一行代码会很有用。太棒了MacOs Catalina上的tle tweak使用的是
ncat
,因为
nc
不提供
--ssl
。如果这算作一行,那么
printf
版本当然也可以通过删除换行符折叠成一行。
printf "%\r\n" \
    "GET /questions HTTP/1.1" \
    "Host: stackoverflow.com" \
    "" |
nc --ssl stackoverflow.com 443