setcap cap_net_bind_service+ep와 함께 작동하도록 Oracle Java 7을 얻는 방법

setcap cap_net_bind_service+ep와 함께 작동하도록 Oracle Java 7을 얻는 방법

Linux에서 1024 미만의 포트를 열 수 있는 권한을 Java 실행 파일에 부여하려고 합니다. 이것이 설정이다

  • /home/test/javaOracle Server JRE 7.0.25 포함
  • 센트OS 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

이 질문을 하기 전에는 유닉스에서 이 기능(파일 기능)에 대해 들어본 적이 없습니다. 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

좋아요, 우리는 이제 같은 페이지에 있습니다. 이 문제를 해결하려면 libjli.so 경로를 사용하여 >this와 같은 파일을 생성하세요.

% cat /etc/ld.so.conf.d/java.conf
/home/someuser/jdk1.7.0_04/jre/lib/i386/jli

이렇게 하면 ld.so가 런타임 캐시를 구축하는 데 사용할 신뢰할 수 있는 사용자 경로에 경로 이름이 추가되고, 이를 통해 ld.so가 이를 보는지 확인합니다. 루트로 실행해야 하며 재부팅이 필요할 수 있습니다.

% 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"
    ...
    

관련 정보