我有以下命令:
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
- 其中一个是状态行本身的一部分
- 一个用于终止响应头
尝试这个
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
否则。