为防止 Java 程序通过权限位运行,进行了哪些更改

为防止 Java 程序通过权限位运行,进行了哪些更改

我总是在我的 Java 程序上设置执行位,以便像调用常规程序一样调用它们,而无需使用-罐参数...只需通过运行路径中带有名称的应用程序即可。

过去,它只需要:chmod +x myjavaprogram.jar,然后从命令行运行它./myjavaprogram.jar

它仍然适用于我安装了 Ubuntu 16.04 之前的版本的电脑。但是,它不适用于任何更新到16.04

除了确保设置了执行位的建议和确保安装该位的一些参考之外,我找不到任何关于该问题的参考: sudo apt install binfmt-support

我之前从未安装过该软件包,但是为了解决这个问题,我运行了安装程序,确认它已经默认安装在 Ubuntu 上并且具有最新版本。

我发现的有关运行 Java 程序问题的唯一其他参考资料是正确安装 Java(openjdk 或 oracle)的规范。我已安装这两个程序并进行了完整更新。我也习惯sudo update-alternatives --config java在两者之间切换。它们都在控制台上显示相同的错误。

这是我从这两种方法中得到的结果:

使用 CLI 作为常规程序:

$ ./HelloWorld.jar
invalid file (bad magic number): Exec format error

使用 -jar 参数:

$ java -jar ./HelloWorld.jar 
Hello World

我文件夹中的许多 Java 应用程序/usr/local/bin都已重命名,不再带有 java 扩展名。它们仍可作为常规程序在装有 Ubuntu 16.04 之前的版本的计算机上运行。

没有人知道如何将此功能添加到 16.04 版本吗?

更新

双击文件浏览器中的应用程序即可。

但是,我有数十个 Java 应用程序,运行它们就像使用普通命令行工具一样,例如,,,,,等等findtop一些命令调用 exec 路径中的其他 Java 应用程序。grepnetstat

答案1

答案是使用binfmt-支持服务。

研究我的 16.04 安装和 14.04 安装之间的区别,我发现以前的 Ubuntu 版本在运行命令时有一个更大的列表update-binfmts --display

该列表包括一个 jarwrapper。

安装罐包装器解决了该问题:

$ sudo apt install jarwrapper

binfmt-support 是一种服务,可以配置为检测运行各种文件所需的内容,包括调用葡萄酒运行 Windows exe 文件。

有关使用 binfmt-support 服务的详细信息,可以通过研究更新-binfmts手册页。

很好奇为什么默认支持被取消了。但我很高兴能够手动恢复对我电脑的支持。

笔记

顺便说一句,程序类型不是由扩展名决定的。它是由应用程序二进制头决定的。因此,应用程序可以命名为任何名称,而无需扩展名。

相关内容