末尾带有jar文件的Shell脚本

7

我下载了一个压缩文件。在这个压缩文件中将会有一个扩展名为.sh的文件。当我使用VI打开这个文件时,在文件开头发现了以下代码:

#!/bin/sh
MYSELF=`which "$0" 2>/dev/null`
[ $? -gt 0 -a -f "$0" ] && MYSELF="./$0"
java=java
if test -n "$JAVA_HOME"; then
    java="$JAVA_HOME/bin/java"
fi
exec "$java" $java_args -jar $MYSELF "$@"
exit 1

我可以通过执行java -jar 文件名或`./文件名'来运行jar文件。

有人能解释一下这是怎么回事吗?你如何创建这样的文件?


1
嗯,我很惊讶那个能工作。我以为JAR文件只是一个带有不同扩展名的ZIP文件,并且ZIP需要以特定的头开始。你能给一个下载链接吗? - Thomas
命令 file <jar-file-name> 的输出是什么? - Eugeniu Rosca
@EugeniuRosca 它会打印数据。如果您想测试它,我已经添加了一个文件链接。 - Hunsu
这是某种启动脚本,请检查传递给它的参数类型。 - Filip Bulovic
@rocky 完成了,谢谢。 - Hunsu
@Thomas 注意我在被接受的答案中的评论;简而言之,Zip文件会忽略文件开头一定量的数据,直到出现有效的Zip头部,但这可能会很棘手。 - rich remer
2个回答

4

请尝试执行以下命令。创建一个普通的jar文件并添加任意内容,或使用现成的jar文件。我将把它命名为“myjar.jar”。

接下来,创建一个名为“hello.sh”的文件,内容如下:

#!/bin/bash

exec echo hello

现在,在一个新的jar文件开头添加这个文件:
cat hello.sh myjar.jar > mytrick.jar
chmod 700 mytrick.jar

最后,有趣的部分来了:输入以下命令:

./mytrick.jar
jar -tf mytrick.jar
unzip mytrick.jar

换句话说,通常情况下,jar/unzip会跳过任何内容直到它们自己的头部。此外,一个shell脚本在调用"exec"行时会"结束"(因为在这一点上,shell解释器被exec行中的命令替换)。
然而,这个技巧基于jar/unzip可能不符合标准的行为。请注意,例如,这个语句失败了(没有效果):
jar -xf mytrick.jar

如果您收到有关损坏的Jar文件的错误,请尝试在shell脚本末尾添加空行。这很重要,可以欺骗Zip解码器跳过脚本头。 - rich remer

3
如果在解压tar文件后的文件名是start-superbeam.sh,请尝试执行chmod +x start-superbeam.sh && ./start-superbeam.sh或者/bin/sh ./start-superbeam.sh。如果程序有参数,请在末尾提供它们。它将在超级光束.sh上运行java,该文件作为jar文件位于末尾。如果您需要设置特殊的java参数,比如内存大小,请将它们设置在环境变量java_args中。至于发生了什么,这是一个带有jar文件的shell脚本,在exit之后。引用自ReallyExecutable Jars:“长期以来,一直存在一种被某些人知道但不广为人知的黑客技巧,可以使jar文件真正可执行,即使用chmod +x命令。该技巧利用jar文件是zip文件,并且zip文件允许任意的杂项被添加到zip文件本身(这就是自解压缩zip文件的工作原理)。有关如何创建,请参阅已接受的答案或链接。”

如果你在链接的文章中添加了细节,我会接受你的答案。 - Hunsu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接