如何在 bash shell 脚本中嵌入二进制文件

您所在的位置:网站首页 shell执行二进制程序 如何在 bash shell 脚本中嵌入二进制文件

如何在 bash shell 脚本中嵌入二进制文件

2023-11-27 04:26| 来源: 网络整理| 查看: 265

如何在 bash shell 脚本中嵌入二进制文件

您是否曾经遇到过这样的情况:您希望在与其他人共享之前在 shell 脚本中包含一个二进制文件?你为什么想这么做?例如,您是公司 IT 部门的系统管理员,为 Linux 用户提供支持。您希望用户只需运行您提供的 shell 脚本即可安装公司的 VPN 软件并在其工作计算机上配置所需的一切。在这种情况下,您创建一个包含所有内容的 tarball(例如,要安装的 VPN 软件、要放置在 /etc 中的 XML 配置文件和配置文件),并将 tar 文件作为嵌入在安装脚本中的形式发送。在另一种情况下,您正在编写一个依赖外部可执行文件来执行某些任务的 shell 脚本。为了脚本的可移植性,您希望将可执行文件本身嵌入到脚本中。无论是否建议在 shell 脚本中嵌入二进制 blob,这样做的能力在某些情况下可能会派上用场。

在本教程中,我们将了解如何在 bash 脚本中包含二进制文件以及如何从脚本中检索它。

在 Shell 脚本中嵌入 Tar 文件

在 shell 脚本中嵌入二进制文件(例如 tarball)的方法是在脚本末尾附加文件内容。继续阅读以了解如何将 tar 文件嵌入到 shell 脚本中。

首先,准备一个 shell 脚本(script.sh),如下所示。该脚本的作用是提取嵌入的 tar 文件并使用提取的内容执行一些操作(在 process_tar() 中定义)。因此,根据您的要求填写process_tar()。

#!/bin/bash # define the tasks that need to be done with the extracted content process_tar() { cd $WORK_DIR # do something with the extracted content } # line number where payload starts PAYLOAD_LINE=$(awk '/^__PAYLOAD_BEGINS__/ { print NR + 1; exit 0; }' $0) # directory where a tarball is to be extracted WORK_DIR=/tmp # extract the embedded tar file tail -n +${PAYLOAD_LINE} $0 | tar -zpvx -C $WORK_DIR # perform actions with the extracted content process_tar exit 0 __PAYLOAD_BEGINS__

请注意,__PAYLOAD_BEGINS__ 应该是脚本的最后一行。即使是空行或换行符也不允许超出此行。

shell 脚本完成并准备就绪后,下一步是通过运行以下命令将实际的 tar 文件 (dummy.tgz) 附加到脚本中:

$ cat dummy.tgz >> script.sh

至此,脚本已准备好进行分发。从命令行调用时,脚本将提取 WORK_DIR 目录中的嵌入 tarball,并按照 process_tar() 中的定义处理提取的内容。

请注意,由于 tar 文件作为二进制数据附加到 shell 脚本,因此在嵌入后重新编辑 shell 脚本(甚至是其中的文本部分)是不安全的。如果在附加 tarball 后修改并保存 shell 脚本,则在运行它时可能会看到以下错误。

gzip: stdin: unexpected end of file tar: Child returned status 1 tar: Error is not recoverable: exiting now 在 Shell 脚本中嵌入编码格式的 Tar 文件

与在 shell 脚本中嵌入二进制文件不同,以编码形式嵌入文件通常更安全。流行的二进制到文本编码方案是 Base64,它由 base64 命令行实用程序实现。

为了使用基于 Base64 的编码/解码,您可以替换上面脚本中的行:

tail -n +${PAYLOAD_LINE} $0 | tar -zpvx -C $WORK_DIR

和:

tail -n +${PAYLOAD_LINE} $0 | base64 -d | tar -zpvx -C $WORK_DIR

这将在解压嵌入内容之前对其进行解码。

然后,您需要通过运行以下命令附加编码格式的 tar 文件:

$ base64 dummy.tgz >> run.sh

至此,shell 脚本已准备好进行分发。您会注意到 tar 文件是以文本格式编码的,您可以重新编辑脚本。

__PAYLOAD_BEGINS__ H4sIAJ0WOGAAA+y8B1RUydY/2kgSBBGkJQsiGaHpppscJEvOGcktNJkmZwEBJSoKKCoIKEgWSZJF chSQKCBZsuQM3a8RZ0bHe+fOvPXd7//+b1msTZ3Tlfbev1371Kmzals4OtxAWIEA/83Eg0n8MNhx DuaH8Xyf/5YAYCgPmI8HzAvm4QfwgCF8YB4AA+y/ytW35ObiaoZkYABYe7k5uMAdbf9dvf9U/n9p sjjB39LN3t6L+/jmvzDGMcB8UOjfwR/CB4Vg8Ify8fACGHj+C7z8lH7h/wf+LnCkO8IC/j89xj/A /9v8h/GCf+H/v5KczCxszazg/9UHwD/w/xB+2PH8h/BDeX/5//+N9Bv+Xx2AiTuYG8bHbQk3/x8d 4y/mPxjMA+HlB0N/n/8QCPR4/kPBsF/z/38jMatJy3KBufmJCZmLMYmYEMzAw+BobkNMKCIC0vJy 在 Shell 脚本中嵌入编码格式的二进制可执行文件

如果要在 shell 脚本中包含二进制可执行文件,可以使用此处描述的相同技术将嵌入式二进制文件保存为可执行文件,并根据需要调用它。请参阅下面的示例脚本 (script2.sh)。

#!/bin/bash # line number where payload starts PAYLOAD_LINE=$(awk '/^__PAYLOAD_BEGINS__/ { print NR + 1; exit 0; }' $0) # directory where a binary executable is to be saved WORK_DIR=/tmp # name of an embedded binary executable EXE_NAME=dummy_executable # extract the embedded binary executable tail -n +${PAYLOAD_LINE} $0 | base64 -d | cat > ${WORK_DIR}/${EXE_NAME} chmod +x ${WORK_DIR}/${EXE_NAME} # run the executable as needed ${WORK_DIR}/${EXE_NAME} exit 0 __PAYLOAD_BEGINS__

然后与之前一样,以编码形式附加二进制可执行文件:

$ base64 dummy_executable >> script2.sh 概括

本教程演示如何将二进制文件嵌入 bash shell 脚本中。虽然本教程可用于涵盖涉及二进制数据的各种用例,但如果您需要的只是自解压存档,那么有一个专用工具可以实现这一点。

如果您觉得本教程有帮助,我建议您查看 linux-console.net 提供的一系列 bash shell 脚本教程。


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3