Linux

如何可靠且可移植地將二進制資訊序列化到 POSIX shell

  • November 10, 2020

問題上下文

我正在嘗試實現一個作業編排器,其代理/工作程序通過 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 作業系統上找到。

並且有一個長長的命令表,其中相關的命令uuencodeuudecode被列為“強制”。

在 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
  1. 為什麼 Ubuntu 並非在所有情況下都包含uuencode/uudecode開箱即用?這是否使其不符合 POSIX/Unix 標準?
  2. 是否有另一個我缺少的命令提供了我正在尋找的那種功能,或者我應該放棄並要求工作人員/代理機器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 的包裝器是相當便攜且經過良好測試的。

引用自:https://serverfault.com/questions/1041878