0

次のスクリプトを使用して単純な CGI サーバーを作成しようとしていました ( http://www.jfranken.de/homepages/johannes/vortraege/netcat_inhalt.en.htmlから)。これは、これが良いアイデアであるかどうかよりも、機能しない技術的な理由に関するものです。

#!/bin/bash
export port=${port:-$1} # inherit $1 as $port
/usr/local/bin/nc -l -p $port -e $0 &  # await further connections on this port
echo "hi"

これが適切に機能しない理由を誰かが知っていますか? 最初の実行時に、端末に「こんにちは」と出力されます。次に、netcat が指定されたポートで待機し、ネットワーク ソケットに関連付けられた STDOUT を使用してこのスクリプトの新しいコピーを生成する準備ができていることを期待します (-e フラグのため)。したがって、指定されたポートへの HTTP GET 要求は、テキスト「hi」を受け取ります。

実際に何が起こるかというと、各 GET リクエストによって新しい netcat プロセスが一度に 1 つずつ生成されますが (これは予想どおりです)、最新の netcat プロセスを強制終了するまで GET リクエストは完了しません。その時点で、発行した最初の GET リクエストは「こんにちは」で応答し、他のすべてのリクエストは接続試行の失敗として返されます。これは、STDOUT リダイレクトの詳細に関する私の混乱と関係があると思われますが、私の理解では、このスクリプトは誰かが接続するたびに新しいバージョンを生成するだけであり、スクリプトの STDIN/OUT はネットワーク ソケットである必要があります。 -e netcat フラグのためです。

4

1 に答える 1

0

netcat の -e オプションは、-DGAPING_SECURITY_HOLE を指定してコンパイルしない限り機能しません。これは、Hobbit の netcat および bsd-ish 派生物でのみ使用できるオプションでもあり、GNU netcat では使用できません。

データを netcat プロセスにパイプすることで、目的の結果を達成できますか? 例えば

echo "hi" | nc -l -p $port 

ほとんど同じ効果があるようですが、 -e フラグを使用した場合のように、接続が確立された後ではなく、接続が確立される前にデータが生成される可能性があります。データが時間ベースまたはインタラクティブである必要がない場合、これは機能します。

于 2011-09-04T13:04:09.180 に答える