CentOS 6.6: java 7: libjli.so를 찾을 수 없습니다.

CentOS 6.6: java 7: libjli.so를 찾을 수 없습니다.

배경:

네트워크 패킷을 캡처하는 Java 프로그램을 작성했습니다. 코드는 래퍼 API를 사용하며 다음을 libpcap통해 프로그램을 실행하는 한 잘 작동합니다.스도.

지금은 "일반" 사용자로 프로그램을 실행할 수 있도록 이를 설정하는 방법을 알아내려고 노력 중입니다. 결국에는 내가 사용하고 있는 시스템에서 작동하게 될 것입니다.원하지 않는다sudo 권한이 있습니다.

몇 가지 조사 끝에 특정 방식으로 권한 있는 액세스를 제공하는 기능을 설정하는 것과 관련된 가능한 솔루션이 발견되었습니다. 여기에는 기능 설정 CAP_NET_RAW( CAP_NET_ADMINei: )이 포함됩니다.sudo setcap 'CAP_NET_RAW=ei CAP_NET_ADMIN=ei' program

질문:

그래서 저는 java제 시스템의 명령에 대해 이 작업을 수행했습니다. 불행히도 이로 인해 java호출 시 다음 메시지가 표시되는 문제가 발생합니다(다양한 포럼의 많은 사람들이 이에 대해 문의함) .

java: error while loading shared libraries: libjli.so: cannot open shared object file: No such file or directory

라이브러리가 존재하며 명령의 라이브러리 목록에 표시됩니다 java.

$ sudo find / -name libjli.so -print
/opt/jdk1.7.0_79/lib/amd64/jli/libjli.so
/opt/jdk1.7.0_79/jre/lib/amd64/jli/libjli.so
/usr/java/jdk1.7.0_79/lib/amd64/jli/libjli.so
/usr/java/jdk1.7.0_79/jre/lib/amd64/jli/libjli.so
/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.35.x86_64/lib/amd64/jli/libjli.so
/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.35.x86_64/jre/lib/amd64/jli/libjli.so
$ which java
/usr/bin/java
$ ls -l /usr/bin/java
lrwxrwxrwx. 1 root root 22 Jun 22  2015 /usr/bin/java -> /etc/alternatives/java
$ ls -l /etc/alternatives/java
lrwxrwxrwx. 1 root root 25 Jun 22  2015 /etc/alternatives/java -> /opt/jdk1.7.0_79/bin/java
$ ls -l /opt/jdk1.7.0_79/bin/java
-rwxr-xr-x. 1 uucp 143 7718 Apr 10  2015 /opt/jdk1.7.0_79/bin/java
$ ldd /usr/bin/java
    linux-vdso.so.1 =>  (0x00007fff3f3fa000)
    libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003150c00000)
    libjli.so => /usr/java/jdk1.7.0_79/lib/amd64/jli/libjli.so (0x00007ff56d563000)
    libdl.so.2 => /lib64/libdl.so.2 (0x0000003151000000)
    libc.so.6 => /lib64/libc.so.6 (0x0000003150800000)
    /lib64/ld-linux-x86-64.so.2 (0x0000003150400000)

그런데 저는 OpenJDK가 아닌 Java 7 JDK를 사용하고 있습니다.

그렇다면 여기서 무엇이 잘못되었나요? 모든 것이 제자리에 있는 것 같지만 필요한 것을 찾을 수 없습니다. 컴퓨터에 두 가지 버전의 Java가 있으면 문제가 됩니까? 또 이상한 상황은 없나요?

검색해 본 결과 많은 분들이 이 문제를 겪고 계시지만 원인이나 해결 방법을 찾을 수 없는 것 같습니다.

누구든지 도와줄 수 있나요?

업데이트 #1

글쎄, 더 자세히 조사한 결과 문제는 Java의 "기능"으로 인한 것 같습니다. 아래 링크에는 문제의 핵심에 도달하는 또 다른 링크가 포함되어 있습니다.

Debian에서 Java를 시작할 때 문제 발생: "공유 라이브러리 로드 오류: libjli.so"포함된 링크 포함setuid Java 프로그램이 작동하지 않는 이유.

내가 읽은 내용에 따르면 특정 기능이 활성화된 상태에서 Java를 실행하는 것은 허용되지 않는 것 같습니다. 아마도 Java 보안이 향상됨에 따라 이는 어느 시점에서 변경될 것입니다.

이에 대해 아시는 분, 더 중요하게는 제공된 솔루션을 아시는 분은 댓글을 남겨주세요.

답변1

chroot 환경에 있는 경우 Java가 작동하려면 /proc를 마운트해야 합니다.

"strace"를 사용하면 다음과 같은 내용이 표시됩니다: readlink("/proc/self/exe", "/usr/lib/jvm/java-8-openjdk-amd6"..., 4096) 이 의미 Java 먼저 /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/../lib/amd64/jli/libjli.so를 찾을 위치를 알기 위해 "/proc/self/exe"를 살펴봅니다. 따라서 /proc 없이는 libjli.so를 찾을 수 없습니다.

감사합니다!

관련 정보