배경:
네트워크 패킷을 캡처하는 Java 프로그램을 작성했습니다. 코드는 래퍼 API를 사용하며 다음을 libpcap
통해 프로그램을 실행하는 한 잘 작동합니다.스도.
지금은 "일반" 사용자로 프로그램을 실행할 수 있도록 이를 설정하는 방법을 알아내려고 노력 중입니다. 결국에는 내가 사용하고 있는 시스템에서 작동하게 될 것입니다.원하지 않는다sudo 권한이 있습니다.
몇 가지 조사 끝에 특정 방식으로 권한 있는 액세스를 제공하는 기능을 설정하는 것과 관련된 가능한 솔루션이 발견되었습니다. 여기에는 기능 설정 CAP_NET_RAW
( CAP_NET_ADMIN
예 ei
: )이 포함됩니다.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를 찾을 수 없습니다.
감사합니다!