Java 如何向本机库添加功能,而不是向运行本机库的可执行文件添加功能? 上下文
我已经完成了一个java库,它将C库与JNI结合使用。 C库在linux中编译成Java 如何向本机库添加功能,而不是向运行本机库的可执行文件添加功能? 上下文,java,linux,java-native-interface,linux-capabilities,Java,Linux,Java Native Interface,Linux Capabilities,我已经完成了一个java库,它将C库与JNI结合使用。 C库在linux中编译成.so文件。此库需要cap\u net\u raw 目标 执行使用所述java库的java进程,无需额外权限。将要使用该库的实际流程是prod中已经存在的流程,我们不想给它们更多的权限 为了测试这一点,我创建了一个jar,并使用和不使用sudo运行它。正如预期的那样,它成功了,但失败了 复制测试的步骤 使用本机方法创建一个java类,我们称之为socketster.java 使用命令生成socketster.h文件
.so
文件。此库需要cap\u net\u raw
目标
执行使用所述java库的java进程,无需额外权限。将要使用该库的实际流程是prod中已经存在的流程,我们不想给它们更多的权限
为了测试这一点,我创建了一个jar
,并使用和不使用sudo
运行它。正如预期的那样,它成功了,但失败了
复制测试的步骤
socketster.java
socketster.h
文件socketster.c
文件,该文件实现socketster.h
,并且需要cap\u net\u raw
capabilityTest.java
类socketster.java
和Test.java
.so
库
结果:失败
向java添加cap
结果:它可以工作,但这不是我想要的,因为现在所有java进程都有了这个功能(请参见目标部分中的粗体部分)
问题
为什么要将上限添加到
。所以不起作用?我还能如何实现这个目标?当你向库中添加功能时,你是否尝试过直接通过类路径加载它,而不是从包含库的jar中加载?@NicolasHenneaux我编辑了我的问题,添加了复制测试的步骤,这样你就可以确切地看到我在做什么。从man capabilities
,似乎可以在可执行文件上设置功能。您可以尝试构建一个JNI库,调用具有所需功能的可执行文件<代码>文件功能>自内核2.6.24以来,内核支持使用setcap(8)将功能集与可执行文件关联。
使用Java.lang.Runtime#exec()
static {
System.loadLibrary("SocketTester");
}
private native int socketTest();
javac -h . SocketTester.java
gcc -o libSocketTester.so socketTester.c -shared -I/usr/lib/jvm/java-14-openjdk-amd64/include -I/usr/lib/jvm/java-14-openjdk-amd64/include/linux
sudo ldconfig
cd /usr/lib
sudo setcap cap_net_raw=epi libSocketTester.so
public static void main(final String[] args) {
SocketTester tester = new SocketTester();
tester.socketTest();
}
java -cp socketTester.jar Test
sudo setcap cap_net_raw=epi libSocketTester.so
sudo setcap cap_net_raw=epi /usr/lib/jvm/java-14-openjdk-amd64/bin/java