无法通过管道将 echo 传送至 netcat 吗?

无法通过管道将 echo 传送至 netcat 吗?

我有以下命令:

echo 'HTTP/1.1 200 OK\r\n' | nc -l -p 8000 -c

当我curl localhost:8000没有看到 HTTP/1.1 200 .. 被打印时。

我在 mac os x 上使用 netcat 0.7.1

有任何想法吗?

#!/bin/bash

trap 'my_exit; exit' SIGINT SIGQUIT

my_exit()
{
        echo "you hit Ctrl-C/Ctrl-\, now exiting.."
        # cleanup commands here if any
}

if test $# -eq 0 ; then
        echo "Usage: $0 PORT"
        echo ""
        exit 1
fi

while true
do
        echo "HTTP/1.1 200 OK\r\n" | nc -l -p ${1} -c
done

并测试:

curl localhost:8000

答案1

您的方法存在多个问题。

转义序列

除非您使用开关,否则转义序列将不被遵守-e

echo -e 'HTTP/1.1 200 OK\r\n'

如果没有-e,您将逐字发送反斜杠和字母。以上内容构成了完整的 HTTP 状态行。

协议

状态行本身并不构成响应。格式需要两个 CRLF

  1. 其中一个是状态行本身的一部分
  2. 一个用于终止响应头

尝试这个

echo -e 'HTTP/1.1 200 OK\r\n\r\n'

netcat 调用

-c标志完全是错误的,因为它需要一个命令参数。

echo -e 'HTTP/1.1 200 OK\r\n\r\n' | nc -l -p $port

内容

即使如此,curl在收到回复后也会阻塞,因为它正在等待服务器提供正文。您可以向发送更多数据nc,也可以选择更合适的答案。

echo -e 'HTTP/1.1 204 No content\r\n\r\n' | nc -l -p $port

请注意,它curl只会打印接收到的内容 - 什么也没有。尝试curl -v了解一下发生了什么。

答案2

我注意到您在 echo 语句中对发送的字符串进行了单引号引用。因此,\r 和 \n 是按字面意思发送的,而不是 Newline 和 Return 的代码。尝试将 echo 切换为双引号 (")。

您可以使用以下方法验证这一点:

 echo 'whatever\r\n' | od -cb
 echo "better\r\n" | od -cb

如果没有线路终止,则 nc 程序很可能不会将该线路传输到目的地。

答案3

简单地,

netcat -l -c "printf 'HTTP/1.1 200 OK\r\n'" -p 8000

printf将“\r”和“\n”解释为转义序列。 echo否则。

相关内容