首先,我已经搜索了一些例子,但是只找到了将压缩文件(比如.tar.gz
)嵌入到shell脚本中的例子。
基本上,如果我有一个打印字符串的C程序(hello.c
),请说Hello!。
我编译它以获得一个可执行的二进制文件。
gcc hello.c -o hello
现在我有了一个shell脚本testEmbed.sh
我要问的是,是否可以将二进制文件(hello)嵌入到shell脚本中,以便在运行时
./testEmbed.sh
它执行二进制以打印Hello!。
Clarification:的另一种选择是将可执行文件压缩到归档文件中,然后在脚本运行时解压它。我想问的是,如果没有这种情况,是否有可能运行该程序。
到目前为止,我还在尝试这里方法。但这对我不起作用。我猜作者在另一个体系结构上使用了其他发行版。所以,基本上这对我不起作用。:P
另外,如果C程序的工作流与jar
不同,我也想知道!
发布于 2012-05-08 02:25:08
是的,这是可以做到的。实际上,它在概念上非常类似于您的链接文章。诀窍是使用uuencode
将二进制代码编码为文本格式,然后将其插入脚本的末尾。
然后以这样的方式编写脚本,即它在自身上运行uudecode
来创建一个二进制文件,更改权限,然后执行它。
uuencode
和uudecode
最初是为了在互联网的前身上移动二进制内容而创建的,而互联网并没有很好地处理二进制信息。转换为文本意味着它也可以作为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
在其输入中查找由uuencode
放置的某些标记行(begin
和end
),因此它只尝试解码编码的程序,而不是整个脚本:
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
发布于 2012-05-08 02:31:35
我认为使自己就是你所描述的。
发布于 2012-05-08 02:45:34
可移植的方法是使用printf
命令和八进制转义:
printf '\001\002\003'
要打印字节1、2和3,由于您可能不想手工编写所有的字节,所以可以使用od -b
命令生成文件的八进制转储,然后可以使用sed
脚本去掉垃圾并将正确的反斜杠放置到位。
https://stackoverflow.com/questions/10491704
复制相似问题