是的,这是可以做到的。它实际上与您链接的文章在概念上非常相似。诀窍是使用uuencode
将二进制文件编码为文本格式,然后将其附加到脚本的末尾。
然后,您的脚本以这样的方式编写,即它uudecode
自己运行以创建二进制文件,更改权限然后执行它。
uuencode
uudecode
最初是为将二进制内容转移到互联网的前身而创建的,互联网不能很好地处理二进制信息。转换为文本意味着它也可以作为 shell 脚本提供。如果由于某种原因您的发行版在您尝试运行时抱怨uuencode
,这可能意味着您必须安装它。例如,在 Debian Squeeze 上:
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 script 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
在其输入 (begin
和end
) 中查找某些标记行,这些标记行是由 放置在那里的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