首先,我已经在Google上进行了搜索,但只找到了将压缩文件(例如.tar.gz
)嵌入到Shell脚本中的示例。
基本上,如果我有一个hello.c
打印字符串的C程序(),请说 Hello World! 。
我编译它以获得可执行的二进制文件
gcc hello.c -o hello
现在我有一个shell脚本 testEmbed.sh
我要问的是是否有可能将二进制( hello )嵌入到shell脚本中,以便在我运行时
./testEmbed.sh
它执行二进制文件以打印 Hello World! 。
澄清 :一种替代方法是,我将可执行文件压缩到存档中,然后在脚本运行时将其解压缩。我要问的是,是否有可能在没有该程序的情况下运行该程序。
到目前为止,我在这里尝试该方法。但这对我不起作用。我猜作者在另一个体系结构上使用了其他发行版。因此,基本上这对我不起作用。:P
另外,如果C程序的工作流程与Java不同jar
,我也想知道!
是的,可以这样做。实际上,它与链接文章的概念非常相似。诀窍是使用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脚本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
问题内容: 我对linux和shell编写非常陌生。我正在尝试使用以下命令从linux上的安全shell(ssh)运行shellscript: 我收到此错误: 尝试使用此命令: 我犯了同样的错误。 尝试使用此命令: 询问我的密码并给我这个错误:。 1. cat -v path / to / mynewshell.sh的结果是:^ @ ^ @ ^ @ ^ @ ^ @ ^ @ ^ @ ^ @ Rscr
我有一个gradle构建设置,在开始时,我想在准备我的环境的子目录中执行一个shellscript。 但是,当我通过调用 或仅通过构建项目来执行任务时,会发生以下错误: 不幸的是,这就是我得到的一切。 我也尝试了以下 - 相同的错误。 我在Windows上使用Gradle 1.10(Android需要),在Cygwin shell中。有什么想法吗?
vendor 文件是什么? 任何一个 Composer 程序包想要传递给安装包的用户的命令行脚本都应该被列为 vendor 文件。 如果包包含了包用户不需要的其他脚本(如构建或编译脚本),则代码不应被列为 vendor 文件。 它是如何定义的? 它是通过将 bin 键添加到项目中来定义的 composer.json。它被指定为文件数组,因此可以为任何给定项目添加多个二进制文件。 { "bi
问题内容: 我想运行一个shell脚本来在构建我的应用程序时更改string.xml中的值。我应该在哪里在gradle中运行脚本,因为其中没有任务。或者,因为我将使用Jenkins构建应用程序,所以我应该在Jenkins服务器上运行脚本吗?请帮帮我。 问题答案: 您可以添加一个运行脚本并使其依赖于构建的步骤。
问题内容: 我尝试谷歌搜索答案,但没有运气。 我需要使用我的超级计算机服务器,但是要运行我的python脚本,必须通过shell脚本执行。 例如我要执行 如何做到这一点? 问题答案: 只需确保python可执行文件在PATH环境变量中,然后在脚本中添加 细节: 在文件job.sh中,放入 执行此命令以使脚本可运行: 运行 :
问题内容: 我想从PHP脚本执行系统上存在的Bash脚本。我的系统上有两个脚本。其中一个是称为at at 的PHP脚本,另一个是称为at at 的Bash脚本。 我的client.php脚本看起来像 我的睾丸看起来像 当我在终端上执行以下操作时 我在终端上得到以下输出 但是当我在打开页面时 我得到以下输出 即使执行了chmod + x testscript,我仍然收到此错误。 我如何从浏览器中获取