nc是一个强大的网络工具,可以用它来扫描端口,传输文件,远程克隆分区等等。详细信息可以参考这篇博文
除了上面的使用场景之外,还能用nc来模拟发送HTTP 请求
test@test-virtual-machine$ nc www.baidu.com 80
GET / HTTP/1.1
<---这里要 换行,根据HTTP协议规定,HTTP header和报文主体之间通过空行来分隔
HTTP/1.1 302 Moved Temporarily
Date: Thu, 10 May 2018 03:47:06 GMT
Content-Type: text/html
Content-Length: 225
Connection: Keep-Alive
Location: http://www.baidu.com/search/error.html
Server: BWS/1.1
X-UA-Compatible: IE=Edge,chrome=1
BDPAGETYPE: 3
Set-Cookie: BDSVRTM=0; path=/
<html>
<head><title>302 Found</title></head>
<body bgcolor="white">
<center><h1>302 Found</h1></center>
<hr><center>a0d46eadd08a4c61268f5c8b1823b29e70957b7c
Time : Fri Apr 20 10:34:36 CST 2018</center>
</body>
</html>
这就模拟了一次HTTP的GET请求,但是在nc的交互中输入比较麻烦,但nc作为伟大Linux/Unix环境下的工具是支持重定向的,"<"符号解决您的烦恼。
事先把HTTP header保存到一个文件里,header.txt
HEAD / HTTP/1.1
Host: www.baidu.com
注意文件末尾要有空行
然后执行
test@test-virtual-machine$ nc www.baidu.com 80 < header.txt
HTTP/1.1 200 OK
Server: bfe/1.0.8.18
Date: Thu, 10 May 2018 03:49:25 GMT
Content-Type: text/html
Content-Length: 277
Last-Modified: Mon, 13 Jun 2016 02:50:40 GMT
Connection: Keep-Alive
ETag: "575e1f80-115"
Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
Pragma: no-cache
Accept-Ranges: bytes
这样一个HEAD请求就被发送了出去,你可以修改header.txt的内容,把method改成GET, POST,也可以加上报文主体,只要符合HTTP请求规范就行。