Contexto do problema
Estou tentando implementar um orquestrador de trabalho cujos programas de agente/trabalhador se conectam a máquinas por meio de uma sessão/shell SSH. Gostaria de transferir arquivos (potencialmente binários) para esses agentes (que podem ser necessários para qualquer tipo de tarefa).
Obviamente, se as portas podem ser configuradas de alguma forma, então nc
e algumas instruções podem ser executadas. No entanto, estou tentando obter algo que funcione com a configuração mais restritiva.
Algo que costumo fazer ao trabalhar nesse tipo de configuração (manualmente) é serializar o arquivo em Base64 ou similar e "colar" os dados na sessão do console, algo como:
echo -n "BINARY_BASE64_DATA" | base64 --decode > file_destination.file
Gostaria de implementar algo assim para o agente/trabalhador que descrevo acima.
Pergunta
O cerne da questão é qual ferramenta usar para ter a maior superfície de compatibilidade. A maioria das máquinas Linux (mesmo as imagens básicas do Docker/Vagrant) parecem ter base64
instalado. No entanto, o FreeBSD não parece ter este comando pré-instalado. Eu sei que posso instalá-lo com pkg
ou Ports, mas gostaria de usar algo pronto para uso o máximo possível.
Procurei algo mais POSIX/Unix-y e encontrei isto: https://en.wikipedia.org/wiki/List_of_Unix_commands que diz:
Esta é uma lista de comandos Unix conforme especificado pelo IEEE Std 1003.1-2008, que faz parte do Single UNIX Specification (SUS). Esses comandos podem ser encontrados em sistemas operacionais Unix e na maioria dos sistemas operacionais do tipo Unix.
e tem uma longa tabela de comandos, dos quais seriam os relevantes uuencode
e uudecode
que estão ambos listados como "obrigatórios".
No FreeBSD, posso ver que ele é instalado de fábrica.
No meu desktop Ubuntu, ele também está presente, embora eu não saiba se saiu da caixa ou foi instalado como uma dependência de outra coisa que instalei. No entanto, dentro de uma caixa Ubuntu Vagrant ( generic/ubuntu2004
, especificamente), a invocação uuencode
mostra a seguinte mensagem:
$ uuencode
Command 'uuencode' not found, but can be installed with:
apt install sharutils
Please ask your administrator.
Em uma imagem do Docker baseada no Ubuntu 14.04, recebo:
# uuencode
bash: uuencode: command not found
- Por que o Ubuntu não inclui
uuencode
/uudecode
pronto para uso em todas as situações? Isso o torna menos compatível com POSIX/Unix? - Existe outro comando que estou faltando que fornece o tipo de funcionalidade que estou procurando ou devo desistir e exigir que a máquina do trabalhador/agente tenha o
base64
binário instalado para trabalhar com o orquestrador?
Nada requer que o Ubuntu, ou qualquer outro sistema, seja compatível com a Especificação Unix Única. Os usuários que não querem sharutils podem desinstalá-lo. Especialmente em imagens reduzidas que foram otimizadas para espaço.
Perceba que os programas normalmente instalados variam de acordo com a plataforma. O GNU coreutils fornece base64, mas é improvável que o BSD tenha o GNU instalado.
Scripts de shell portáteis são difíceis. base64 é relativamente fácil, e você já encontrou pequenas diferenças depois de verificar apenas 2 distribuições. Muitas vezes, as linguagens de script ajudam na portabilidade, como Python (
base64
) ou Perl (MIME::Base64
).Parte da solução do Ansible para fazer qualquer coisa de forma portátil é com o Python, incluindo arquivos arbitrários. Considere estudar como o Ansible está fazendo as transferências de arquivos, se não usar o Ansible para a instalação inicial. E em relação à colocação de arquivos, seu wrapper em torno do sftp é bastante portátil e bem testado.