使用netcat编写HTTP头请求脚本

时间:2009-03-13 13:28:46

标签: bash echo netcat

我正在尝试使用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问题,回声问题还是netcat问题。

我通过Wireshark检查了流量,成功请求(手动输入)在第二个数据包中发送尾随换行符,而echo,printf和text文件方法将换行符保留在同一个数据包中,但我不是确定导致这种行为的原因。

5 个答案:

答案 0 :(得分:25)

你需要两批“\ r \ n”,并告诉netcat等待响应。 printf "HEAD / HTTP/1.0\r\n\r\n" |nc -n -i 1 10.1.1.2 80或类似的应该有效。

答案 1 :(得分:7)

另一种方法是使用所谓的'heredoc'约定。

$ nc -n -i 1 10.1.1.2 80 <<EOF
> HEAD / HTTP/1.0
>
> EOF

答案 2 :(得分:2)

让nc等待响应的另一种方法是向输入添加休眠。 e.g。

(printf 'GET / HTTP/1.0\r\n\r\n'; sleep 1) | nc HOST 80

答案 3 :(得分:0)

您可以使用以下netcat命令制作您的实例网络服务器:

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&

答案 4 :(得分:0)

这一行也可以作为等效词:

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