在 bash 中提取 HTTP 内容不适用于 nc 输出

Extracting HTTP content in bash doesn't work with nc output

假设我有这个 HTTP 响应:

POST / HTTP/1.1
Content-Type: text/plain;charset=UTF-8
Content-Length: 5
Connection: Keep-Alive
Accept-Encoding: gzip
Accept-Language: en,*
User-Agent: Mozilla/5.0
Host: 127.0.0.1:55764

Hello

我只对内容感兴趣 ("Hello")。如果文本来自文件,我发现此命令有效:

cat data.txt | tr '\n' '#' | sed "s/.*##//" | tr '#' '\n'
Hello

其中 data.txt 包含上面的文本。 但是如果我尝试用 nc:

的输出来喂它
#!/bin/bash
while true
do
  echo -e "HTTP/1.1 200 OK\n\n" | ./busybox-armv7l nc -l -p 55764 | tr '\n' '#' | sed "s/.*##//" | tr '#' '\n'
done

它不起作用,即它只是打印出所有内容:

POST / HTTP/1.1
Content-Type: text/plain;charset=UTF-8
Content-Length: 5
Connection: Keep-Alive
Accept-Encoding: gzip
Accept-Language: en,*
User-Agent: Mozilla/5.0
Host: 127.0.0.1:55764

HelloPOST / HTTP/1.1
Content-Type: text/plain;charset=UTF-8
Content-Length: 5
Connection: Keep-Alive
Accept-Encoding: gzip
Accept-Language: en,*
User-Agent: Mozilla/5.0
Host: 127.0.0.1:55764

Hello

为什么管道适用于 cat 而不适用于 nc

nc 的输出转到 stderr 只需在第二个 | 之后添加 & 以使管道有效:

echo -e "HTTP/1.1 200 OK\n\n" | ./busybox-armv7l nc -l -p 55764 |& tr '\n' '#' | sed "s/.*##//" | tr '#' '\n