1

Я хочу создать bash-скрипт, который считывает "полезную нагрузку" двоичных данных из внешнего файла и выплевывает другой bash-скрипт с экранированием и инкапсуляцией этих данных внутри строковой переменной. Пример:

  • mydata.bin - исходные данные: двоичный файл данных для инкапсуляции
  • myencoder.sh - главный исполнитель: bash-скрипт, который преобразует двоичные данные в скрипт со строковой переменной
  • mypayload.sh - Конечный результат: сценарий bash, сгенерированный myencoder.sh, который содержит закодированные данные в виде строковой переменной.

Чтобы использовать это, я бы запустил myscript.sh mydata.bin mypayload.sh и myscript.sh конвертировал /escape /wrap / любой файл mydata.bin в mypayload.sh

После выполнения этой команды файл mypayload.sh будет выглядеть примерно так:

# Generated by myencoder.sh with data from mydata.bin
encoded_data="[...]ugly escaped string representation of the binary data found in mydata.bin[...]"

Проблема, с которой я сталкиваюсь, заключается в том, что я не знаю, как решить, как правильно закодировать данные. Я читал, что printf "% q" может быть использован для экранирования строк, но как вызвать его для данных, извлеченных из внешнего двоичного файла, полностью ускользнуло от меня.

Поэтому, пожалуйста, любые замечания по этому поводу и любые советы приветствуются!

PS: я не хочу вводить какие-либо зависимости вне bash, если это возможно. В зависимости от особенностей bash 4.x все в порядке.

PPS: кодирование должно поддерживать небольшой размер и производительность кодирования / декодирования.

3 ответа3

1

Очень трудно обрабатывать ноль байтов из bash. Вы можете вывести нулевой байт

printf %c

но вы не можете хранить его в переменной.

Гораздо проще использовать внешние инструменты:

xxd < mydata.bin > encoded
xxd -r < encoded > binary
1

Это не полное решение вашей проблемы; как уже упоминали другие, работа с NULL во входном файле затруднена в bash, и я уверен, что потенциал входных файлов Unicode может вызвать еще больше головной боли.

Но я потратил немного времени на размышления о том, как вы можете использовать printf %q в bash, чтобы сделать что-то похожее на ваше предложение, и придумал этот быстрый взлом:

echo -n 'myvar="'
while read -r; do
  if [ ! -z "$REPLY" ]; then
    printf %q "$REPLY"
  fi
  echo -n '\n'
done
echo '"'

Я уверен, что это может сломаться во многих отношениях, но, возможно, это может удовлетворить некоторую часть вашего любопытства.

0

Этот ответ не дает прямого ответа на вопрос, поскольку очевидно, что 0 переменных в байтах переменных bash невозможны, и, по-видимому, невозможно перевести их в строки, которые можно безопасно хранить внутри переменных bash, не полагаясь на внешние инструменты, такие как xxd или uuencode, которые не являются доступно по умолчанию на платформах, где будет запускаться мой скрипт.

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

Я использовал эту статью в качестве моего источника. В основном, подход использует строку-разделитель между сценарием и двоичными данными и никогда не позволяет интерпретатору bash достигать двоичной части в конце.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .