Как надежно и переносимо сериализовать двоичную информацию в оболочку POSIX

Контекст проблемы

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

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

Что-то, что я часто делаю при работе с такого рода настройками (вручную), - это сериализовать файл в Base64 или аналогичный и «вставлять» данные в сеанс консоли, что-то вроде:

echo -n "BINARY_BASE64_DATA" | base64 --decode > file_destination.file

Я хотел бы реализовать что-то подобное для агента / рабочего, о котором я говорил выше.

Вопрос

Суть вопроса в том, какой инструмент использовать, чтобы иметь самый большой поверхность совместимости. На большинстве Linux-машин (даже в простых образах Docker / Vagrant) установлено base64 . Однако, похоже, что во FreeBSD эта команда не установлена ​​заранее. Я знаю, что могу установить его с помощью pkg или портов, но я хотел бы как можно чаще использовать что-то нестандартное.

Я искал что-то более POSIX / Unix-y, и нашел это: https://en.wikipedia.org/wiki/List_of_Unix_commands , в котором говорится:

Это список команд Unix, указанных в стандарте IEEE Std 1003.1-2008, который является частью Единая спецификация UNIX (SUS). Эти команды можно найти в операционных системах Unix и большинстве Unix-подобных операционных систем.

и содержат длинную таблицу команд, из которых соответствующими будут uuencode и uudecode которые оба указаны как "обязательные".

На FreeBSD я вижу, что он установлен "из коробки".

На моем рабочем столе Ubuntu он также присутствует, хотя я не знаю, есть ли он пришел из коробки или был установлен как зависимость от чего-то еще, что я установил. Однако внутри окна Ubuntu Vagrant ( generic / ubuntu2004 , в частности) при вызове uuencode отображается следующее сообщение:

$ uuencode

Command 'uuencode' not found, but can be installed with:

apt install sharutils
Please ask your administrator.

В образе Docker, который я создал на основе Ubuntu 14.04, я получаю :

# uuencode
bash: uuencode: command not found
  1. Почему Ubuntu не включает uuencode / uudecode из коробки во всех ситуациях? Делает ли это его менее совместимым с POSIX / Unix?
  2. Есть ли еще одна команда, которую мне не хватает, которая обеспечивает ту функциональность, которую я ищу, или я должен просто отказаться и потребовать, чтобы машина рабочего / агента имела двоичный файл base64 установлен для работы с оркестратором?
1
задан 9 November 2020 в 23:48
1 ответ

Почему Ubuntu не включает готовые uuencode/uudecode во всех ситуациях?

Ничто не требует от Ubuntu или любой другой системы соответствия Единой спецификации Unix. Пользователи, которым не нужен шарутилс, могут удалить его. Особенно на обрезанных изображениях, которые были оптимизированы для пространства.

Помните, что обычно устанавливаемые программы зависят от платформы. GNU coreutils предоставляет base64, но маловероятно, что в BSD установлен GNU.

Есть ли еще одна команда, которую я пропустил, которая обеспечивает функциональность, которую я ищу?

Сценарии переносимой оболочки сложны. base64 относительно прост, и вы уже нашли незначительные различия, проверив всего 2 дистрибутива. Часто языки сценариев помогают с переносимостью, например Python (base64) или Perl (MIME::Base64).

Часть решения Ansible для переносимости чего-либо связана с Python, включая удаление произвольных файлов. Рассмотрите возможность изучения того, как Ansible выполняет передачу файлов, если не используете Ansible для первоначальной установки. А что касается размещения файлов, его оболочка вокруг sftp довольно переносима и хорошо протестирована.

2
ответ дан 9 November 2020 в 23:12

Теги

Похожие вопросы