Чтение двоичного файла в переменную в bash - PullRequest
1 голос
/ 13 марта 2019

У меня есть следующий скрипт bash. Я ожидаю, что файлы out.1 и out.2 будут одинаковыми, но они разные. Я подозреваю, что проблема в том, как bash работает с двоичными файлами. Итак, как правильно читать в двоичном файле переменную в bash?

curl -s http://cacerts.digicert.com/DigiCertSHA2HighAssuranceServerCA.crt > out.1
A=`curl -s http://cacerts.digicert.com/DigiCertSHA2HighAssuranceServerCA.crt`
echo "$A" >  out.2
diff out.1 out.2

1 Ответ

1 голос
/ 13 марта 2019

Переменные bash (и переменные окружения, и аргументы unix, и ...) не являются бинарно-безопасными.Самая большая проблема заключается в том, что они не могут содержать нулевые байты (то есть символ ASCII NUL), так как это терминатор строки.В некоторых ситуациях также возникают проблемы с удалением / добавлением символов новой строки, а в некоторых версиях echo символы обратной косой черты рассматриваются как экранированные символы, которые необходимо интерпретировать.По сути, ответ таков: не пытайтесь хранить двоичные данные в оболочке.

Но вы можете преобразовать данные в недвоичный формат (hex, base64, uuencode и т. Д.) И сохранить, передатьи т. д. данные в этой форме.Просто не забудьте конвертировать форматы, где это уместно.Вот пример использования base64:

$ curl -s http://cacerts.digicert.com/DigiCertSHA2HighAssuranceServerCA.crt > out.1
$ a=$(curl -s http://cacerts.digicert.com/DigiCertSHA2HighAssuranceServerCA.crt | base64)
$ echo "$a" | base64 -d >out.2
$ diff -s out.*
Files out.1 and out.2 are identical

Кстати, я рекомендую использовать имена переменных в нижнем или смешанном регистре (есть куча переменных с заглавными буквами со специальным значением, и один из них используется случайно)может иметь странные эффекты), а также использовать $( ) вместо кавычек (легче для чтения и позволяет избежать некоторых неясных синтаксических странностей).

...