如何使用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
添加到选项中。@macOSnc
上的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