背景:
ネットワークパケットをキャプチャするJavaプログラムを作成しました。コードはラッパーAPIを使用し、以下を介してlibpcap
プログラムを実行する限りうまく動作します。Sudo。
現在、「一般」ユーザーとしてプログラムを実行できるように設定する方法を理解しようとしています。結局のところ、私が使用しているシステムで動作するようになります。欲しくない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を使用しています。
それでは、ここで何が間違っていますか?すべてが正しい場所にあるようですが、必要なものが見つかりません。コンピュータに2つのバージョンの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)まず、 /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/../lib/amd64/jli/libjli.so を見つける場所を知るために、「/proc/self/exe」を見てみましょう。したがって、/ procがなければlibjli.soを見つけることができません。
ありがとうございます!