シェルスクリプトでHTTP GETリクエストを実行するには、opensslを使用する必要があります。現在これを行うために使用している行を以下に示します。これは、次の形式のXML応答のコンテンツを解析しています。
<Result>success</Result>
<Result>failure</Result>
echo -e "GET /test HTTP/1.1\r\nHost:$(hostname)\r\n\r\n" | openssl 2>&1 s_client -quiet -connect server-url:443 | grep -o -P --color '(?<=Result\>).*(?=\</Result)'
これは機能し、それに応じて文字列「成功」または「失敗」を返します。私が直面している問題は、GETリクエストの実行後にopenssl
コマンドが終了せず、代わりに追加の入力を待機することです。これは、-ign_eof
オプションによる自動終了を防ぐ暗黙の-quiet
が原因であると思います。 -no_ign_eof
オプションを使用してみましたが、GETリクエストが応答を受信する前にopenssl
コマンドが終了するため、それを使用すると応答のコンテンツを取得できません。
どのようにこのコマンドを変更して、GETリクエストをstdinで渡すことができるようにします(これをループに入れたいので必要です)が、各リクエストの後にopenssl
コマンドを終了させますか?
本当にがすべきことは、curl
、wget
、またはlibwww-PerlのGET
コマンドなど、Webリソースを取得するために設計されたツールを使用することです。何も利用できない場合は、システム管理者に適切なものをインストールしてもらう必要があります。
それが邪魔にならないように...
Webサーバーが接続を閉じなかったため、openssl
コマンドは終了しません。
デフォルトでは、HTTPはパフォーマンスを最適化するために、各リクエストの後も接続を開いたままにします。 1つの要求が終了すると、新しい接続を閉じて再度開くのではなく、同じ接続を介して別の要求を送信できます。
代わりにサーバーに接続を閉じるように指示したい場合は、Connection: close
HTTPヘッダー。
別の単純な(しかしおそらくもっと悪い)解決策は、HTTP/1.1の代わりにHTTP/1.0を使用することです。