【问题标题】:How to read & handle POST requests with Netcat如何使用 Netcat 读取和处理 POST 请求
【发布时间】:2019-11-17 15:36:10
【问题描述】:

我想用 Bash 和 netcat 制作一个简单的 HTTP 服务器,但在完全读取 POST 请求时遇到问题 - 最后一行总是丢失。

服务器是这样启动的:

netcat -l -p 8080 -e ./ncserver.sh

ncserver.sh,减少到显示问题的最低限度:

#!/bin/bash

while read INPUT; do
    echo "Req line: $INPUT" >&2
done;

我使用 Postman 向服务器发出请求,并希望脚本将整个请求数据转储到 stderr。请求是一个简单的 JSON:

{
    name: "Eugene",
    age: 34
}

更新: 原始邮递员请求数据:

POST /foo/bar HTTP/1.1
Host: localhost:8080
Content-Type: application/json
Cache-Control: no-cache
Postman-Token: 7f5a57a7-1664-e79c-2242-7ba6b638e260

{
    name: "Eugene",
    age: 34
}

在服务器的输出中,我得到了缺少最后一行 } 的所有标头和请求正文。其他内容类型也是如此,例如 multipart/form-data - 最后一行总是丢失。

注意:如果我在 JSON 后添加一个空行,我可以在终端输出中看到 }

我尝试使用cat /dev/stdin 而不是read,但得到了No such device or address

这个问题大概可以概括为如何在 Bash 中以正确的二进制形式读取 HTTP 请求?

【问题讨论】:

  • postman 的原始部分显示什么?如果你使用 curl 会发生什么? curl -d '{"Name":"Eugene", "age":"34"}' -H "Content-Type: application/json" -X POST yourserver.com>
  • 不知何故,当我使用 curl 时,根本没有请求正文输出,只有标题和两个空行。邮递员请求非常基本,我用它更新了问题。另外,如果我在 Postman 请求正文中添加新行,它会起作用。
  • 我已经用 raw 和 bin 文件对此进行了测试,它适用于 Postman 5.5.4 - google chrome 插件。我没有使用 netcat -e 选项。我正在重定向标准输入 nc -l -p 8080
  • 我猜这不完全一样,因为我无法从脚本响应回客户端,而我最终想要这样做。此外,即使我删除了< ncserver.sh 部分,netcat 似乎也是如此。
  • 我认为问题归结为read 的行为以及它需要换行符作为分隔符的事实,而请求正文中不存在该换行符。关于如何解决它的任何想法?

标签: bash http post netcat


【解决方案1】:

尝试如下。

#!/bin/bash

while IFS= read -r INPUT || [ "$INPUT" ]; do
    echo "Req line: $INPUT" >&2
done;   

注意事项。

IFS= 是为了保留任何缩进。
-r 是为了防止反斜杠解释。
检查INPUT:当read 到达文件末尾而不是行尾时,它分配变量但退出。因此,请检查INPUT 中是否有任何内容。

【讨论】:

  • 问题是,来自nc的数据中没有EOF,如果我做nc -o reqdata,我可以看到最新的字符是},所以设置IFS不会做任何事情这里。对我来说似乎唯一的方法是read -n1,它有它自己的缺陷......
  • 试试上面的脚本
  • 问题的解决方法在于检查INPUT。在这里使用IFS=-r 很好。
  • 我当然试过了,结果一模一样。
【解决方案2】:

你好@x1n13y84issmd42

以防万一您仍在寻找解决方案.. 尝试以下方法时我得到了很好的结果:

#!/usr/bin/env bash

read -d } PAYLOAD;

“-d }”选项让 read 将所有通过 stdin 的内容存储在 PAYLOAD 中,直到遇到“}”,而不是在每一行出现时对其进行解析。

然后您可以使用 jq 处理 $PAYLOAD}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-02
    • 2012-03-14
    • 1970-01-01
    相关资源
    最近更新 更多