次のコマンドがあります。
echo 'HTTP/1.1 200 OK\r\n' | nc -l -p 8000 -c
そして私がcurl localhost:8000
印刷されているHTTP/1.1 200 ..が表示されません。
私はnetcat 0.7.1を搭載したMac OS Xを使用しています
何か案は?
#!/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
あなたのアプローチには複数の問題があります。
-e
スイッチを使用しない限り、エスケープシーケンスは適用されません。
echo -e 'HTTP/1.1 200 OK\r\n'
-e
がない場合は、バックスラッシュと文字をそのまま送信します。上記は完全なHTTPステータス行を形成します。
ステータス行だけでは応答にはなりません。 format には2つのCRLFが必要です
これを試して
echo -e 'HTTP/1.1 200 OK\r\n\r\n'
-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
を試して、何が起こっているのかを垣間見ることができます。
単に、
netcat -l -c "printf 'HTTP/1.1 200 OK\r\n'" -p 8000
printf
は '\ r'および '\ n'をエスケープシーケンスとして解釈します。 echo
はしません。
エコーステートメントで送信されている文字列を単一引用していることに気づきました。したがって、\ rと\ nは文字どおりに送信され、改行と改行のコードは送信されません。エコーを二重引用符( ")に切り替えてみてください。
これは次の方法で確認できます。
echo 'whatever\r\n' | od -cb
echo "better\r\n" | od -cb
回線終端がないと、ncプログラムが回線を宛先に送信しない可能性があります。