如何让 Oracle java 7 与 setcap cap_net_bind_service+ep 一起使用

如何让 Oracle java 7 与 setcap cap_net_bind_service+ep 一起使用

我试图授予 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"
    ...
    

相关内容