在 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
假设我有这个 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