bash - 使用 netcat 编写 HTTP header 请求脚本

标签 bash echo netcat

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

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

这个有效:

    [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 以准备编写脚本时,它不会返回 header 。
文本文件由 HEAD 请求和两个换行符组成:

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 和文本文件方法将换行符保存在同一个数据包中,但我没有确定是什么导致了这种行为。

最佳答案

你需要两对“\r\n”,还要告诉netcat等待响应。

以下或类似的东西应该有效:

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

关于bash - 使用 netcat 编写 HTTP header 请求脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/642707/

相关文章:

linux - Bash脚本被杀死时如何杀死当前命令

java - Bash 脚本的行为不同于 Docker 运行命令而不是容器本身?

linux - Linux 的 IF 语句

bash - 如何使用 BASH 从文件名中删除特定字符

java - 通过POST发送参数到php文件并读取php文件的echo

c - ncurses带有echo()的getcur()是否可以确保在执行程序中的下一条语句之前在屏幕上看到该字符?

bash - 使用 netcat 发送 POST 请求

java - Socket通信,Java客户端C服务器

c - DNS session 的结构是什么?

linux - linux中python的可执行路径错误