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