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