繁体   English   中英

如何使用 Netcat 读取和处理 POST 请求

[英]How to read & handle POST requests with Netcat

我想用 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 请求?

尝试如下。

#!/bin/bash

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

点注意。

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

你好@x1n13y84issmd42

以防万一您仍在寻找解决方案.. 在尝试以下操作时,我取得了不错的结果:

#!/usr/bin/env bash

read -d } PAYLOAD;

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM