openssl s_clientを使用してコマンドラインからhttpsサーバーからファイルをインポートする

openssl s_clientを使用してコマンドラインからhttpsサーバーからファイルをインポートする

httpsサーバーでホストされているファイルがあり、次のようにファイルopenssl s_clientを自分のクライアントに転送できるようにしたいですopenssl s_client -connect <my_ip:my_port>/my_file

現時点では、コマンドを実行してから入力してファイルの内容を取得できますが、対話型ではないGET my_fileように自動化したいと思います。-quietスイッチを使用しても役に立ちません。

注:私はこの製品を使用したいデバイスには他のファイル転送プログラムがないので、使い続けます。openssl

答え1

実際にHTTP / 0.9を使用できる場合は、これがうまくいくでしょう。

printf '%s\r\n\r\n' 'GET my_file' | openssl s_client -connect <my_ip:my_port>

答え2

openssl s_client特に良いツールではありませんが、実行できます。 2つの部分に分けてみましょう。まず、HTTP要求が行われ、次に応答からコンテンツが抽出されます。

HTTPをリクエストする

ここで最も難しいのは、s_client標準入力が閉じたときに接続を閉じることです。したがって、接続が閉じるまでstdinを開いたままにしてください。に基づいてこのサーバーエラーの回答、次のようにすることができます。

(printf "GET $PATH HTTP/1.0\r\nHost: $HOST\r\n\r\n"; sleep 10) | \
    openssl s_client -connect $HOST:443 -quiet) > /tmp/output.tmp

これにはいくつかの大きな制限があります。まず、sleep転送が完了するまで十分に長く設定する必要があります。しかし、永遠に待つほど長くはないでしょう。第二に、リダイレクト処理がないため、302他の場所に移動せずに要求したURLから直接データを提供するURLが必要です。

データ抽出

/tmp/output.tmpこれで、データを含むHTTP応答を含むファイルが作成されました。そしていくつかのタイトル。ヘッダーを削除するのは思ったより難しいです。新しい行\r\nと改行を混ぜ\nてバイナリデータを転送できるからです。

ファイルがUnixスタイルのテキスト(シェルスクリプトなど)の場合は、すべての\r文字を削除し、最初の空白行を含むすべてを削除できます。

tr -d '\r' < /tmp/output.tmp | sed '1,/^$/d' > /tmp/output

ファイルがバイナリ(実行ファイルなど)の場合、文字だけを削除することはできません\r。ファイルの最初の数バイトが非常に一意であり(\xF7ELFこの例では前提)、GNU grepを使用できると仮定すると、次のことができます。

SKIP=$(grep -aboF "$(printf "\xf7ELF")" output | head -1 | awk -F: '{print $1}')
dd ibs=1 if=/tmp/output.tmp of=/tmp/output skip=$SKIP

関連情報