问题上下文
我正在尝试实现一个作业编排器,其代理/工作程序通过 SSH 会话/shell 连接到机器。我想将(可能是二进制)文件传输到这些代理(任何类型的任务都可能需要)。
显然,如果可以以任何方式配置端口,则nc
可以执行一些指令。但是,我正在尝试获得适用于最严格设置的东西。
在这种设置中(手动)工作时,我经常做的事情是将文件序列化为 Base64 或类似文件,然后将数据“粘贴”到控制台会话中,例如:
echo -n "BINARY_BASE64_DATA" | base64 --decode > file_destination.file
我想为我上面描述的代理/工作人员实现类似的东西。
问题
问题的关键在于使用什么工具来获得最大的兼容性表面。大多数 Linux 机器(甚至是最基本的 Docker/Vagrant 映像)似乎都已base64
安装。然而,FreeBSD 似乎没有预装这个命令。我知道我可以使用或 Ports 安装它pkg
,但我想尽可能多地使用开箱即用的东西。
我寻找了更多 POSIX/Unix-y 的东西,发现了这个:https ://en.wikipedia.org/wiki/List_of_Unix_commands它说:
这是 IEEE Std 1003.1-2008 指定的 Unix 命令列表,它是单一 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.
在我基于 Ubuntu 14.04 的 Docker 映像上,我得到:
# uuencode
bash: uuencode: command not found
- 为什么 Ubuntu 并非在所有情况下都包含
uuencode
/uudecode
开箱即用?这是否使其不符合 POSIX/Unix 标准? - 是否有另一个我缺少的命令提供了我正在寻找的那种功能,或者我应该放弃并要求工作人员/代理机器
base64
安装二进制文件以与协调器一起使用?
没有什么要求 Ubuntu 或任何其他系统符合单一 Unix 规范。不想要 sharutils 的用户可能会卸载它。特别是在针对空间进行了优化的裁剪图像上。
意识到通常安装的程序因平台而异。GNU coreutils 提供 base64,但 BSD 不太可能安装 GNU。
可移植的 shell 脚本很困难。base64 相对简单,您只检查了 2 个发行版就已经发现了细微的差异。脚本语言通常有助于提高可移植性,例如 Python (
base64
) 或 Perl (MIME::Base64
)。Ansible 的任何可移植解决方案的一部分是使用 Python,包括 slurping 任意文件。考虑研究 Ansible 如何进行文件传输,如果不使用 Ansible 进行初始安装。关于放置文件,它围绕 sftp 的包装器是相当便携且经过良好测试的。