【问题标题】:Shell script with jar file at the end最后带有 jar 文件的 Shell 脚本
【发布时间】:2015-09-07 04:39:24
【问题描述】:

我下载了archive file。在存档中将有一个具有.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 file 或 `./file' 来运行 jar。

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

【问题讨论】:

  • 嗯,我很惊讶这行得通。我认为 JAR 文件只是具有不同扩展名的 ZIP 文件,并且 ZIP 需要以特定的标头开头。能给个下载链接吗?
  • file <jar-file-name> 命令的输出是什么?
  • @EugeniuRosca 它打印数据。如果您想测试它,我添加了指向该文件的链接
  • 它是某种启动脚本,检查它传递了什么样的参数。
  • @rocky 完成,谢谢。

标签: java shell jar


【解决方案1】:

如果解压 tar 文件后的文件是 start-superbeam.sh,请尝试使用 chmod +x start-superbeam.sh && ./start-superbeam.sh/bin/sh ./start-superbeam.sh

如果程序有参数,在最后提供它们。它将在 superbeam.sh 上运行 java,最后作为 jar 文件。

如果您需要设置特殊的 java 参数,例如内存大小,您可以在环境变量 java_args 中设置它们。

至于发生了什么,这是一个 shell 脚本,在 exit 后面有一个 jar 文件。引用ReallyExecutable Jars:

在某些圈子里早就知道了一种 hack,但并不广为人知 已知,使 jars 真正可执行,在 chmod +x 意义上。黑客 利用 jar 文件是 zip 文件这一事实,而 zip 文件允许在 zip 文件本身之前添加任意内容 (这就是自解压 zip 文件的工作原理)。

至于如何创建,请参见接受的答案或链接。

【讨论】:

  • 如果您添加了链接文章中提供的详细信息,我会接受您的回答。
【解决方案2】:

自己尝试以下命令。开始创建一个包含任何内容的普通 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 解码器跳过脚本标题非常重要。
猜你喜欢
  • 2015-09-24
  • 1970-01-01
  • 1970-01-01
  • 2019-12-02
  • 2016-04-28
  • 1970-01-01
  • 2017-06-16
  • 2018-05-07
  • 2013-06-07
相关资源
最近更新 更多