20

我正在尝试使用 netcat 来了解有关 HTTP 工作原理的更多信息。我想用 bash 或 Perl 编写其中的一些脚本,但我在测试的早期就遇到了一个绊脚石。

如果我直接从提示符运行 netcat 并输入 HEAD 请求,它会起作用,并且我会收到我正在探测的 Web 服务器的标头。

这有效:

    [romandas@localhost ~]$ nc 10.1.1.2 80
    头/HTTP/1.0

    HTTP/1.1 200 正常
    MIME 版本:1.0
    服务器:已编辑
    内容长度:0
    缓存控制:公共
    过期:2050 年 1 月 1 日星期六 18:00:00 GMT

    [romandas@localhost ~]$

但是,当我将相同的信息放入文本文件并通过管道或重定向将其提供给 netcat 以准备编写脚本时,它不会返回标头。
文本文件由 HEAD 请求和两个换行符组成:

头/HTTP/1.0

通过echoprintf发送相同的信息也不起作用。

$ 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 和文本文件方法将换行符保留在同一个数据包中,但我不确定是什么原因这种行为。

4

5 回答 5

26

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

于 2009-03-13T13:34:25.620 回答
8

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

$ nc -n -i 1 10.1.1.2 80 <<EOF
> HEAD / HTTP/1.0
>
> EOF
于 2012-01-23T23:09:20.700 回答
2

让 nc 等待响应的另一种方法是在输入中添加睡眠。例如

(printf 'GET / HTTP/1.0\r\n\r\n'; sleep 1) | nc HOST 80
于 2015-11-10T18:08:26.253 回答
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&
于 2016-07-07T05:37:50.200 回答
0

这条线也可以等效地工作:

echo -e "HEAD / HTTP/1.1\nHost: 10.1.1.2\nConnection: close\n\n\n\n" | netcat 10.1.1.2 80
于 2016-10-05T07:44:59.030 回答