Извлечение HTTP-содержимого в bash не работает с выводом nc - PullRequest
0 голосов
/ 18 ноября 2018

Допустим, у меня есть этот 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?

1 Ответ

0 голосов
/ 18 ноября 2018

вывод nc идет в stderr, просто добавьте & через секунду |, чтобы сделать канал эффективным:

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

...