Shell脚本与jar文件结束

Hun*_*nsu 7 java shell jar

我下载了一个存档文件.在存档中将有一个文件,其中包含.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
Run Code Online (Sandbox Code Playgroud)

我可以通过执行java -jar file或"./file" 来运行jar .

有人可以解释一下发生了什么吗?你怎么能创建这样的文件?

pas*_*qui 4

自行尝试以下命令。开始创建包含任何内容的普通 jar 文件,或者使用您拥有的人。我将其命名为“myjar.jar”

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

#!/bin/bash

exec echo hello
Run Code Online (Sandbox Code Playgroud)

现在,在新 jar 文件的开头添加此文件:

cat hello.sh myjar.jar > mytrick.jar
chmod 700 mytrick.jar
Run Code Online (Sandbox Code Playgroud)

最后,有趣的部分,输入:

./mytrick.jar
jar -tf mytrick.jar
unzip mytrick.jar
Run Code Online (Sandbox Code Playgroud)

换句话说,通常 jar/unzip 会跳过任何内容,直到它们自己的标头。此外,shell 脚本在调用“exec”的行中“结束”(因为此时 shell 解释器被 exec 行中的命令替换)。

然而,这个技巧是基于 jar/unzip 的行为,可能不符合标准。请注意,例如,此语句失败(没有任何效果):

jar -xf mytrick.jar
Run Code Online (Sandbox Code Playgroud)