首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在shell脚本中嵌入可执行的二进制文件

在shell脚本中嵌入可执行的二进制文件
EN

Stack Overflow用户
提问于 2012-05-08 02:20:04
回答 3查看 10.3K关注 1票数 11

首先,我已经搜索了一些例子,但是只找到了将压缩文件(比如.tar.gz)嵌入到shell脚本中的例子。

基本上,如果我有一个打印字符串的C程序(hello.c),请说Hello!

我编译它以获得一个可执行的二进制文件。

代码语言:javascript
运行
复制
gcc hello.c -o hello

现在我有了一个shell脚本testEmbed.sh

我要问的是,是否可以将二进制文件(hello)嵌入到shell脚本中,以便在运行时

代码语言:javascript
运行
复制
./testEmbed.sh

它执行二进制以打印Hello!

Clarification:的另一种选择是将可执行文件压缩到归档文件中,然后在脚本运行时解压它。我想问的是,如果没有这种情况,是否有可能运行该程序。

到目前为止,我还在尝试这里方法。但这对我不起作用。我猜作者在另一个体系结构上使用了其他发行版。所以,基本上这对我不起作用。:P

另外,如果C程序的工作流与jar不同,我也想知道!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-05-08 02:25:08

是的,这是可以做到的。实际上,它在概念上非常类似于您的链接文章。诀窍是使用uuencode将二进制代码编码为文本格式,然后将其插入脚本的末尾。

然后以这样的方式编写脚本,即它在自身上运行uudecode来创建一个二进制文件,更改权限,然后执行它。

uuencodeuudecode最初是为了在互联网的前身上移动二进制内容而创建的,而互联网并没有很好地处理二进制信息。转换为文本意味着它也可以作为shell脚本提供。如果由于某种原因,您的发行版在尝试运行uuencode时会发出抱怨,这可能意味着您必须安装它。例如,在Debian压缩程序中:

代码语言:javascript
运行
复制
sudo aptitude install sharutils

会帮你拿到相关的遗嘱。这是我经历的过程。首先创建和编译C程序hello.c

代码语言:javascript
运行
复制
pax> cat hello.c

#include <stdio.h>
int main (void) {
    printf ("Hello\n");
    return 0;
}

pax> gcc -o hello hello.c

然后创建一个shell脚本testEmbed.sh,它将自己解码:

代码语言:javascript
运行
复制
pax> cat testEmbed.sh

#!/bin/bash
rm -f hello
uudecode $0
./hello
rm -f hello
exit

第一个rm语句演示了hello可执行文件是由这个脚本重新创建的,而不是在编译过程中留下的。由于您也需要文件中的有效负载,所以将编码的可执行文件附加到文件的末尾:

代码语言:javascript
运行
复制
pax> uuencode hello hello >>testEmbed.sh

然后,当您执行脚本testEmbed.sh时,它会提取可执行文件并运行它。

之所以这样做,是因为uudecode在其输入中查找由uuencode放置的某些标记行(beginend),因此它只尝试解码编码的程序,而不是整个脚本:

代码语言:javascript
运行
复制
pax> cat testEmbed.sh

#!/bin/bash
rm -f hello
uudecode $0
./hello
rm -f hello
exit

begin 755 hello
M?T5,1@$!`0````````````(``P`!````$(,$"#0```#`!@```````#0`(``'
M`"@`'@`;``8````T````-(`$"#2`!`C@````X`````4````$`````P```!0!
: : :
M:&%N9&QE`%]?1%1/4E]%3D1?7P!?7VQI8F-?8W-U7VEN:70`7U]B<W-?<W1A
M<G0`7V5N9`!P=71S0$!'3$E"0U\R+C``7V5D871A`%]?:38X-BYG971?<&-?
4=&AU;FLN8G@`;6%I;@!?:6YI=```
`
end

您可能还需要担心其他一些事情,比如您的程序可能需要目标系统上不存在的共享库,但是上面的过程基本上就是您所需要的。

JAR文件的进程非常相似,只是运行它的方式不同。它仍然是一个文件,但是您需要替换行:

代码语言:javascript
运行
复制
./hello

具有能够运行JAR文件的功能,例如:

代码语言:javascript
运行
复制
java -jar hello.jar
票数 18
EN

Stack Overflow用户

发布于 2012-05-08 02:31:35

我认为使自己就是你所描述的。

票数 5
EN

Stack Overflow用户

发布于 2012-05-08 02:45:34

可移植的方法是使用printf命令和八进制转义:

代码语言:javascript
运行
复制
printf '\001\002\003'

要打印字节1、2和3,由于您可能不想手工编写所有的字节,所以可以使用od -b命令生成文件的八进制转储,然后可以使用sed脚本去掉垃圾并将正确的反斜杠放置到位。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10491704

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档