![为防止 Java 程序通过权限位运行,进行了哪些更改](https://linux22.com/image/1147703/%E4%B8%BA%E9%98%B2%E6%AD%A2%20Java%20%E7%A8%8B%E5%BA%8F%E9%80%9A%E8%BF%87%E6%9D%83%E9%99%90%E4%BD%8D%E8%BF%90%E8%A1%8C%EF%BC%8C%E8%BF%9B%E8%A1%8C%E4%BA%86%E5%93%AA%E4%BA%9B%E6%9B%B4%E6%94%B9.png)
我总是在我的 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 应用程序,运行它们就像使用普通命令行工具一样,例如,,,,,等等find
。top
一些命令调用 exec 路径中的其他 Java 应用程序。grep
netstat
答案1
答案是使用binfmt-支持服务。
研究我的 16.04 安装和 14.04 安装之间的区别,我发现以前的 Ubuntu 版本在运行命令时有一个更大的列表update-binfmts --display
。
该列表包括一个 jarwrapper。
安装罐包装器解决了该问题:
$ sudo apt install jarwrapper
binfmt-support 是一种服务,可以配置为检测运行各种文件所需的内容,包括调用葡萄酒运行 Windows exe 文件。
有关使用 binfmt-support 服务的详细信息,可以通过研究更新-binfmts手册页。
很好奇为什么默认支持被取消了。但我很高兴能够手动恢复对我电脑的支持。
笔记
顺便说一句,程序类型不是由扩展名决定的。它是由应用程序二进制头决定的。因此,应用程序可以命名为任何名称,而无需扩展名。