bash変数にbase64データの2つのチャンクがあります。base64データ内の通常の改行はスペースに置き換えられ、変数は基本的に1つの非常に長い1行の文字列です。
変数に含まれているbase64データの2つのチャンクをデコードできますが、それを実行しようとするといくつかのニュアンスが発生しました。私がこれに正しく取り組んでいるかどうか、または改行を含まないbase64データをデコードするより良い方法があるかどうかを知りたいのですが。ここに私が持っているものがあります:
最初のチャンクは350文字で、次のように正常にデコードできます。
echo ${DATA::350} | openssl base64 -d | wc -c
256
2番目のチャンクは5745文字ですが、上記のコマンドでは期待される結果が生成されません。つまり:
$ echo {DATA:350} | openssl base64 -d | wc -c
432
ただし、改行を戻すと機能します。
$ echo ${DATA:350} | tr ' ' "\n" | openssl base64 -d | wc -c
4240
私は最初のチャンクがないようにするには十分に小さいであることを、いくつかの行の長さに問題があると期待し、それが使用されているデコーダBASE64の特徴であると思われる(2つの通常のもの、だろうbase64
とopenssl base64
、動作が異なります)。
base64
(代わりのデコーダはopenssl base64
)最初の無効な文字(空白)で停止し、したがってだけOpenSSLの出力432文字(9「行」)に対し、最初の「行」(出力データの48バイト)をデコードします。base64
コマンドは無視するオプションがあるごみを、ので、この作品を:
$ echo ${DATA:350} | base64 -d -i | wc -c
4240
OpenSSLデコーダーにはそのようなオプションがないようです。
また、空白の削除は完全に機能しますbase64
が、機能しませんopenssl base64
:
$ echo ${DATA:350} | tr -d ' ' | openssl base64 -d | wc -c
400
$ echo ${DATA:350} | tr -d ' ' | base64 -d | wc -c
4240
とにかく、とにかくデコードされたデータをさらに処理する必要があったので、改行を置き換えてOpenSSLデコーダーを使用しました。
$ openssl enc -d -a -in <(echo ${DATA:350} | /usr/bin/tr ' ' "\n") -aes-256-cbc -pass file:<(echo $skey) | ...
しかし、OpenSSLが改行を含まないbase64データをデコードできることを理解したいと思いますか?
tr
、${var//old[/new}
- を使用せずに、文字自体を変更または削除できますが、部分文字列と同時にはできません。