如何可靠且可移植地將二進制資訊序列化到 POSIX shell
問題上下文
我正在嘗試實現一個作業編排器,其代理/工作程序通過 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 在所有情況下都不包括開箱即用的 uuencode/uudecode?
沒有什麼要求 Ubuntu 或任何其他系統符合單一 Unix 規範。不想要 sharutils 的使用者可能會解除安裝它。特別是在針對空間進行了優化的裁剪圖像上。
意識到通常安裝的程序因平台而異。GNU coreutils 提供 base64,但 BSD 不太可能安裝 GNU。
我是否缺少另一個提供我正在尋找的功能的命令
可移植的 shell 腳本很困難。base64 相對簡單,您只檢查了 2 個發行版就已經發現了細微的差異。腳本語言通常有助於提高可移植性,例如 Python (
base64
) 或 Perl (MIME::Base64
)。Ansible 的任何可移植解決方案的一部分是使用 Python,包括 slurping 任意文件。考慮研究 Ansible 如何進行文件傳輸,如果不使用 Ansible 進行初始安裝。關於放置文件,它圍繞 sftp 的包裝器是相當便攜且經過良好測試的。