使用netcat编写HTTP头请求的脚本

21
我想通过使用netcat来学习HTTP的工作原理。我想在bash或Perl中编写一些脚本,但是在测试的早期阶段就遇到了一个问题。
如果我直接从提示符运行netcat并输入HEAD请求,则可以正常工作,并收到我正在探测的Web服务器的标头。
这个命令有效:
    [romandas@localhost ~]$ nc 10.1.1.2 80
    HEAD / HTTP/1.0
HTTP/1.1 200 OK MIME-Version: 1.0 Server: Edited out Content-length: 0 Cache-Control: public Expires: Sat, 01 Jan 2050 18:00:00 GMT
[romandas@localhost ~]$
但是,当我将相同的信息放入文本文件中并通过管道或重定向将其馈送给netcat以准备编写脚本时,它不返回标头。
文本文件包含HEAD请求和两个换行符:
HEAD / HTTP/1.0

通过echo或printf发送相同信息也无效。
$ printf "HEAD / HTTP/1.0\r\n"; |nc -n 10.1.1.2 80
$ /bin/echo -ne 'HEAD / HTTP/1.0\n\n' |nc 10.1.1.2 80
有什么想法吗?不确定是bash问题,还是echo问题,还是netcat问题。
我通过Wireshark检查了流量,并且成功请求(手动键入)在第二个数据包中发送尾随换行符,而echo、printf和文本文件方法将换行符保留在同一个数据包中,但我不确定是什么导致了这种行为。

FYI,printf中的\r\n是有意义的;我在不同的组合中切换了\r和\n,以查看是否会改变任何内容--但没有效果。 - romandas
5个回答

27

你需要两对 "\r\n",并且要告诉 netcat 等待响应。

以下代码或类似代码应该可以正常工作:

printf "HEAD / HTTP/1.0\r\n\r\n" | nc -n -i 1 10.1.1.2 80

这对我不起作用。我直接复制了你的代码,但连接仍然在传输头部之前终止。 - romandas
那么问题就出在你的服务器端。在这里,printf "HEAD / HTTP/1.0\r\n\r\n" | nc www.toothycat.net 80 是可以工作的。 - moonshadow
服务器没有终止请求;它是由客户端发起的。Wireshark显示我的客户端在HEAD请求数据包之后发送了一个FIN数据包,然后服务器ACK并优雅地终止。不确定是什么原因导致了这种差异。您使用的netcat版本是什么? - romandas
2
尝试添加“-q 10”以使netcat在STDIN收到EOF后等待响应。 - moonshadow
1
啊,就是这个。我正在使用GNU netcat(v1.84),所以选项是-i 1(等待连续输入行之间的时间)。这导致第二个换行符稍后发送,并生成了所需的HEAD响应。把它编辑到你的答案中,我会接受它:)谢谢! - romandas
显示剩余2条评论

10
另一种方式是使用所谓的“heredoc”约定。
$ nc -n -i 1 10.1.1.2 80 <<EOF
> HEAD / HTTP/1.0
>
> EOF

2
另一种让nc等待响应的方法是在输入中添加sleep。例如:
(printf 'GET / HTTP/1.0\r\n\r\n'; sleep 1) | nc HOST 80

我喜欢这种方法,因为你必须使用nc-i标志指定整数秒数;然而,使用sleep可以指定小数,对于我来说(使用本地服务器),更小的间隔似乎有效,例如0.01秒。 - t354

0

您可以使用以下netcat命令来创建实例的Web服务器:

MYIP=$(ifconfig eth0|grep 'inet addr'|awk -F: '{print $2}'| awk '{print $1}')
while true; do echo -e "HTTP/1.0 200 OK\r\n\r\nWelcome to $MYIP" | sudo nc -l -p 80 ; done&

用于默认网关的IPv4 IP(无论使用哪个接口;Linux):ip route show | grep -o 'src [\.0-9]\+' | uniq | cut -d ' ' -f2 - Ján Sáreník

0

这行代码也可以作为等效代码:

echo -e "HEAD / HTTP/1.1\nHost: 10.1.1.2\nConnection: close\n\n\n\n" | netcat 10.1.1.2 80

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接