CentOS 6.6; java 7:找不到 libjli.so

CentOS 6.6; java 7:找不到 libjli.so

背景:

我写了一个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)

顺便说一句,我使用的是 Java 7 JDK,而不是 OpenJDK。

那么,这里出了什么问题呢?一切似乎都已就位,但却找不到所需的东西。机器上有两个版本的 Java 这有什么关系吗?难道还有其他奇怪的情况吗?

根据我的搜索,这个问题很多人都遇到过,但我似乎找不到原因,也找不到解决方案。

有人能帮忙吗?

更新#1

好吧,经过更多调查后,问题似乎是由于 Java 中的一个“特性”造成的。下面的链接包含另一个触及问题核心的链接。

在 Debian 上启动 java 时出现问题:“加载共享库时出错:libjli.so”与嵌入的链接为什么 setuid java 程序不起作用

根据我在这些内容中读到的内容,似乎不允许运行启用了特定功能的 java。也许随着 Java 安全性的提高,这种情况会在某个时候发生改变。

如果有人知道这一点,或者更重要的是,知道已经提供了解决方案,请发表评论。

答案1

如果您处于 chroot 环境中,则需要挂载 /proc 才能使 java 工作。

如果你使用“strace”,你会看到类似这样的内容: readlink("/proc/self/exe", "/usr/lib/jvm/java-8-openjdk-amd6"..., 4096) 这意味着 Java首先查看“/proc/self/exe”以了解在哪里查找/usr/lib/jvm/java-8-openjdk-amd64/jre/bin/../lib/amd64/jli/libjli.so。所以如果没有/proc就找不到libjli.so

此致!

相关内容