2016-10-05 4 views
1

Bashからbase64でメッセージ(特殊文字を含む場合があります)をデコードします。ファイルに保存すると48バイトのデータが得られます。それでも変数に渡すと、41バイトの文字列になります。これは、Bashの特殊文字の処理方法(^ @)が原因であると考えています。一例として、 Bashのバイト配列(特殊文字を含む場合があります)

meow_bash=`printf $variable | base64 --decode` 
echo ${#meow_bash} # return 41 

printf $variable | base64 --decode > meow 
wc -c meow # return 48 

今私は、データの機密性のためにファイルに配列を保存しない場合。私はまた、それを行うためにシェルスクリプトを使用する必要があります。それを成功させるためにbash/shを使用する方法はありますか?

+0

^@はヌルバイトであり、bash変数として格納することも、任意のプログラムに引数として渡すこともできません。バイナリデータにはbashを使用しないでください。あなたはbase64を保存して、何かに書くときはいつでもそれを変換することができます。 –

+0

IIRC私はbash(私はそれが古いバージョンだと思います)を削除文字(16進7f)で混乱させるのを見たことがあります。ロケールによっては、一部のツールでは対処できない場合があります。このため、バイナリデータを扱うシェルツールでは、base64(または16進数またはそれに類するもの)またはパイプを使用して取り込みます。 –

答えて

4

してください、あなたの拡張を引用することを学ぶ:printf "$variable"を使用し、ないprintf $variable

本の最も簡単な原因は、cがゼロバイトで終わるとして変数を定義していることです。
したがって、C文字列にゼロバイトを含めることはできません。
Bash(cで書かれています)は、変数の中のゼロ値を黙って削除します。

しかし、ストリーム(パイプなど)で0バイトで動作する可能性があります。

単純な回避策は、変数内に値を(復号後に)格納しないことです。

また、変数には、base64でエンコードして保存すると、任意のバイト値を含めることができます。何バイトを消去しないパイプに変数の値を用い

:したがって、変数は安全 BASE64符号化された値を割り当てることができる

$ variable="YWoAa2hzZ2RrAGxzawBmZGp2" 
$ printf '%s' "$variable" | base64 --decode | wc -c 
18 

ある:ストリームが含まれている可能性がゼロ値バイト。

しかし変数にデコード値を割り当てる:

$ variable="YWoAa2hzZ2RrAGxzawBmZGp2" 
$ meow_bash="$(printf '%s' "$variable" | base64 --decode)" 
$ printf '%s' "$meow_bash" | wc -c 
15 
$ echo "${#meow_bash}" 
15 

変数$meow_bash 3ゼロのバイトを失っています。

+0

私はtake homeメッセージは次のようになると思います:何かバイト配列を直接bash変数に割り当てることはありません。 – Chong

関連する問題