2016-10-05 1 views
1

Декодировать сообщение (может содержать специальный символ) с base64 из Bash. Сохранение файла приведет к 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 (я думаю, что это была старая версия) путается с удалением символов (hex 7f). И в зависимости от языкового стандарта некоторые инструменты могут отказаться от использования, например, последовательности, которые недействительны UTF-8, и ... Из-за этого средства оболочки, которые обрабатывают двоичные данные, будут либо брать его в base64 (или в шестнадцатеричном виде, либо в чем-то подобном), либо через каналы. –

ответ

4

Пожалуйста, научитесь цитировать ваши разложения: использовать printf "$variable", не printf $variable

Самый простой причиной этого является то, что с определяет переменную как окончание в нулевом байте.
Следовательно, строка c не может содержать нулевой байт.
Bash (записывается в c), молча удаляет любое нулевое значение внутри переменных.

Но может работать с нулевыми байтами в потоках (трубах и т. П.).

Простым решением является не сохранять значения (после декодирования) внутри переменных.

Также обратите внимание, что переменная может содержать любое значение байта при сохранении в кодировке 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

Я предполагаю, что исходное сообщение будет: никогда не присваивать массив байтов непосредственно переменной bash, независимо от того, что ... – Chong