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

Ank*_*kit 8 c java binary shell

首先,我已经使用Google搜索,但只找到了将压缩文件(例如a .tar.gz)嵌入到shell脚本中的示例.

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

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

gcc hello.c -o hello
Run Code Online (Sandbox Code Playgroud)

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

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

./testEmbed.sh
Run Code Online (Sandbox Code Playgroud)

它执行二进制文件来打印Hello World!.

澄清:一种方法是将可执行文件压缩到一个存档中,然后在脚本运行时将其解压缩.我要问的是,如果没有它可以运行程序.

到目前为止,我在这里尝试这种方法.但它对我不起作用.我想作者正在另一个架构上使用其他一些发行版.所以,基本上这对我不起作用.:P

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

pax*_*blo 15

是的,这可以做到.它实际上与你的链接文章在概念上非常相似.诀窍是使用uuencode将二进制文件编码为文本格式,然后将其添加到脚本的末尾.

然后编写脚本,使其uudecode自身运行以创建二进制文件,更改权限然后执行它.

uuencode并且uudecode最初是为了在互联网的前身上转移二进制内容而创建的,它不能很好地处理二进制信息.转换为文本意味着它也可以作为shell脚本发布.如果由于某种原因您的分发在您尝试运行时抱怨uuencode,则可能意味着您必须安装它.例如,在Debian Squeeze上:

sudo aptitude install sharutils
Run Code Online (Sandbox Code Playgroud)

将为您获取相关的可执行文件.这是我经历的过程.首先创建并编译您的C程序hello.c:

pax> cat hello.c

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

pax> gcc -o hello hello.c
Run Code Online (Sandbox Code Playgroud)

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

pax> cat testEmbed.sh

#!/bin/bash
rm -f hello
uudecode $0
./hello
rm -f hello
exit
Run Code Online (Sandbox Code Playgroud)

第一个rm语句演示了hello可执行文件是由这个脚本重新创建的,而不是在编译中徘徊.由于您还需要文件中的有效负载,因此将编码的可执行文件附加到其末尾:

pax> uuencode hello hello >>testEmbed.sh
Run Code Online (Sandbox Code Playgroud)

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

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

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
Run Code Online (Sandbox Code Playgroud)

您还应该担心其他一些问题,例如您的程序可能需要目标系统上不存在的共享库,但上述过程基本上就是您所需要的.


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

./hello
Run Code Online (Sandbox Code Playgroud)

能够运行JAR文件的东西,例如:

java -jar hello.jar
Run Code Online (Sandbox Code Playgroud)

  • 将一个`trap'rm -f hello'SIGINT`添加到shell脚本中也是一个好主意,以便在用户Ctrl-C的程序中清除临时文件. (2认同)

dsc*_*ulz 5

我认为makeself就是你所描述的。