在shell脚本嵌入可执行二进制(Embed a Executable Binary in a sh

2019-06-24 05:47发布

首先,我已经一派但只找到其中一个压缩文件(比如一个实例.tar.gz )被嵌入到一个shell脚本。

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

我编译得到可执行的二进制

gcc hello.c -o hello

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

我是问是否可以嵌入shell脚本中的二进制文件( 你好 ),让我跑的时候

./testEmbed.sh

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

澄清 :另一种方式是我压缩可执行文件到归档和脚本运行时,然后将其解压缩。 我是问,如果有可能不运行该程序。

到现在为止,我尝试的方法在这里 。 不过,这并不为我工作。 我猜测作者是使用上的另一种架构一些其他的分布。 所以,基本上这并没有为我工作。 :P

此外,如果一个C程序的工作流程从Java不同jar ,我想知道呢!

Answer 1:

是的,这是可以做到。 它实际上是在概念上的链接的文章颇为相似。 诀窍是使用uuencode二进制编码成文本格式,然后把它钉住到脚本的结尾。

您的脚本,然后写在它运行的方式uudecode对自己创建一个二进制文件,更改权限,然后执行它。

uuencodeuudecode对先导,以互联网,它没有移左右的二进制内容的设立初衷处理二进制信息很好。 到文本的转换意味着它可以运输一个shell脚本以及。 如果由于某种原因,当您尝试运行分发抱怨uuencode ,这可能意味着你必须安装它。 例如,在Debian的挤压:

sudo aptitude install sharutils

将获得相关的可执行文件给你。 这是我所经历的过程。 首先创建和编译的C程序hello.c

pax> cat hello.c

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

pax> gcc -o hello hello.c

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

pax> cat testEmbed.sh

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

第一rm声明表明, hello正在创建重新执行该脚本,不遗留从编辑游逛。 既然你需要的文件在有效载荷为好,装上编码的可执行到它的结束:

pax> uuencode hello hello >>testEmbed.sh

之后,当你执行脚本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

还有其他的事情你应该担心的,比如你的程序可能会要求不要在目标系统上存在的共享库的可能性,但上面的过程基本上是你所需要的。


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

./hello

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

java -jar hello.jar


Answer 2:

我想makeself是你描述。



Answer 3:

便携的方式做,这是与printf命令和八进制转义:

printf '\001\002\003'

打印字节1,2和3。因为你很可能不想写全部由手工的od -b命令可以用来生成文件的八进制转储,那么你可以使用sed脚本脱光关闭垃圾,并把正确的反斜线到位。



文章来源: Embed a Executable Binary in a shell script