Я пытаюсь реализовать оркестратор заданий, чьи агентские / рабочие программы подключаются к машинам через сеанс / оболочку 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
uuencode
/ uudecode
из коробки во всех ситуациях? Делает ли это его менее совместимым с POSIX / Unix? двоичный файл base64
установлен для работы с оркестратором? Почему Ubuntu не включает готовые uuencode/uudecode во всех ситуациях?
Ничто не требует от Ubuntu или любой другой системы соответствия Единой спецификации Unix. Пользователи, которым не нужен шарутилс, могут удалить его. Особенно на обрезанных изображениях, которые были оптимизированы для пространства.
Помните, что обычно устанавливаемые программы зависят от платформы. GNU coreutils предоставляет base64, но маловероятно, что в BSD установлен GNU.
Есть ли еще одна команда, которую я пропустил, которая обеспечивает функциональность, которую я ищу?
Сценарии переносимой оболочки сложны. base64 относительно прост, и вы уже нашли незначительные различия, проверив всего 2 дистрибутива. Часто языки сценариев помогают с переносимостью, например Python (base64
) или Perl (MIME::Base64
).
Часть решения Ansible для переносимости чего-либо связана с Python, включая удаление произвольных файлов. Рассмотрите возможность изучения того, как Ansible выполняет передачу файлов, если не используете Ansible для первоначальной установки. А что касается размещения файлов, его оболочка вокруг sftp довольно переносима и хорошо протестирована.