web-dev-qa-db-ja.com

opensslを使用してHTTP GETリクエストから結果を取得するにはどうすればよいですか?

シェルスクリプトで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コマンドを終了させますか?

7
conorgriffin

本当にがすべきことは、curlwget、またはlibwww-PerlのGETコマンドなど、Webリソースを取得するために設計されたツールを使用することです。何も利用できない場合は、システム管理者に適切なものをインストールしてもらう必要があります。

それが邪魔にならないように...

Webサーバーが接続を閉じなかったため、opensslコマンドは終了しません。

デフォルトでは、HTTPはパフォーマンスを最適化するために、各リクエストの後も接続を開いたままにします。 1つの要求が終了すると、新しい接続を閉じて再度開くのではなく、同じ接続を介して別の要求を送信できます。

代わりにサーバーに接続を閉じるように指示したい場合は、Connection: close HTTPヘッダー。

5
Michael Hampton

別の単純な(しかしおそらくもっと悪い)解決策は、HTTP/1.1の代わりにHTTP/1.0を使用することです。

0
JepZ