Java 如何向本机库添加功能,而不是向运行本机库的可执行文件添加功能? 上下文

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文件

我已经完成了一个java库,它将C库与JNI结合使用。 C库在linux中编译成
.so
文件。此库需要
cap\u net\u raw

目标 执行使用所述java库的java进程,无需额外权限。将要使用该库的实际流程是prod中已经存在的流程,我们不想给它们更多的权限

为了测试这一点,我创建了一个
jar
,并使用和不使用
sudo
运行它。正如预期的那样,它成功了,但失败了

复制测试的步骤
  • 使用本机方法创建一个java类,我们称之为
    socketster.java
  • 使用命令生成
    socketster.h
    文件
  • 创建
    socketster.c
    文件,该文件实现
    socketster.h
    ,并且需要
    cap\u net\u raw
    capability
  • 编译
  • 将libsocketster.so移动到/usr/lib
  • 戴上帽子
  • 创建一个
    Test.java
  • 使用
    socketster.java
    Test.java
  • 运行测试
  • 我已经试过了 将cap添加到
    .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