web-dev-qa-db-ja.com

エコーをnetcatにパイプできませんか?

次のコマンドがあります。

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

2
Sparrowcide

あなたのアプローチには複数の問題があります。

エスケープシーケンス

-eスイッチを使用しない限り、エスケープシーケンスは適用されません。

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

-eがない場合は、バックスラッシュと文字をそのまま送信します。上記は完全なHTTPステータス行を形成します。

プロトコル

ステータス行だけでは応答にはなりません。 format には2つのCRLFが必要です

  1. ステータスライン自体の一部として1つ
  2. Respnseヘッダーを終了する1つ

これを試して

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を試して、何が起こっているのかを垣間見ることができます。

3
Felix Frank

単に、

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

printfは '\ r'および '\ n'をエスケープシーケンスとして解釈します。 echoはしません。

0
moebius_eye

エコーステートメントで送信されている文字列を単一引用していることに気づきました。したがって、\ rと\ nは文字どおりに送信され、改行と改行のコードは送信されません。エコーを二重引用符( ")に切り替えてみてください。

これは次の方法で確認できます。

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

回線終端がないと、ncプログラムが回線を宛先に送信しない可能性があります。

0
mdpc