我试图授予 java 可执行文件在 Linux 上打开 1024 以下端口的权利。这是设置
/home/test/java
包含 Oracle 服务器 JRE 7.0.25- CentOS 6.4
这是 getcap 返回的内容
[test@centos6 java]$ pwd
/home/test/java
[test@centos6 java]$ getcap bin/java
bin/java = cap_net_bind_service+ep
[test@centos6 java]$ getcap jre/bin/java
jre/bin/java = cap_net_bind_service+ep
尝试执行java会出现以下错误。
[test@centos6 java]$ bin/java
bin/java: error while loading shared libraries: libjli.so: cannot open shared object file: No such file or directory
[test@centos6 java]$ jre/bin/java
jre/bin/java: error while loading shared libraries: libjli.so: cannot open shared object file: No such file or directory
当二进制文件被 setcap 授予提升权限时,是否可以运行 Java 7_u25,如果可以,如何运行?
JDK-6919633:运行时不支持 POSIX 文件功能(又名 Linux 功能) 说
Note: when using the setcap the libraries needed by the java launcher
should be present in /usr/lib or any other "trusted" location that the
runtime loader (rtld) uses to find shared libraries.
如何使共享库受信任?
答案1
在你问这个问题之前,我从来没有听说过 Unix 中的这个功能(文件功能)。我发现这个链接似乎有关于如何使 ld.so 信任您的共享库的解决方案:
摘自该帖子
当提升可执行文件的权限时,运行时加载器 (rtld)(更好地称为 ld.so)将不会与不受信任路径中的库链接。这就是 ld.so(1) 的设计方式。如果需要运行这样的可执行文件,则必须将该路径添加到ld.so的可信路径中,以下介绍如何执行此操作:
Fedora 11:
% uname -a
Linux localhost.localdomain 2.6.29.4-167.fc11.i686.PAE #1 SMP Wed May 27 17:28:22 EDT 2009 i686 i686 i386 GNU/Linux
% sudo setcap cap_net_raw+epi ./jdk1.7.0_04/bin/java
% ./jdk1.7.0_04/bin/java -version
./jdk1.7.0_04/bin/java: error while loading shared libraries: libjli.so: cannot open shared object file: No such file or directory
好了,我们现在在同一页面上,要解决这个问题,请创建一个文件,例如 > this,其路径为 libjli.so
% cat /etc/ld.so.conf.d/java.conf
/home/someuser/jdk1.7.0_04/jre/lib/i386/jli
这会将路径名添加到 ld.so 将使用的受信任用户路径,以构建其运行时缓存,验证 ld.so 是否通过执行此操作看到它,需要以 root 身份运行它,并且可能需要重新启动。
% ldconfig | grep libjli
libjli.so -> libjli.so
.......
现在测试java:
% ./jdk1.7.0_04/bin/java -version
java version "1.7.0_04-ea"
Java(TM) SE Runtime Environment (build 1.7.0_04-ea-b18)
就这样......
参考
答案2
只是为了显示在端口 80(或低于 1024 的任何端口)启用 Java 侦听的完整过程:
- 对于 JAVA_HOME:
$> export JAVA_HOME=/usr/local/java/graalvm-ce-java8-20.2.0
- 您应该启用 java 二进制文件的功能:
$> sudo /sbin/setcap 'cap_net_bind_service=ep' /usr/local/java/graalvm-ce-java8-20.2.0/bin/java
- 之后你在运行java时会开始出现一些错误:
$> java -version ./bin/java: error while loading shared libraries: libjli.so: cannot open shared object file: No such file or directory
- 要解决这个问题,您应该更新
ldconfig
.只需创建一个java.conf
文件:$> cat /etc/ld.so.conf.d/java.conf /usr/local/java/graalvm-ce-java8-20.2.0/lib/amd64/jli /usr/local/java/graalvm-ce-java8-20.2.0/jre/lib/amd64/jli $> java -version
- 现在java可以工作了:
$> java -version openjdk version "1.8.0_262" ...