java—如何将功能添加到本机库中,而不是添加到运行它的可执行文件中?

bybem2ql  于 2021-06-29  发布在  Java
关注(0)|答案(0)|浏览(227)

上下文

我做了一个java库,它使用jni的c库。c库在linux中编译成 .so 文件。这个图书馆需要 cap_net_raw 能力。

目标

在没有额外特权的情况下执行java进程,该进程使用所述java库。要使用库的实际进程是prod中已有的进程,我们不想给它们更多的权限。
为了验证这一点,我创建了一个 jar 不管有没有 sudo . 不出所料,它成功了,但失败了。

复制测试的步骤

用本机方法创建一个java类,我们来调用它 SocketTester.java ```
static {
System.loadLibrary("SocketTester");
}
private native int socketTest();

生成 `socketTester.h` 使用命令归档

javac -h . SocketTester.java

创建 `socketTester.c` 实现的文件 `socketTester.h` 哪个需要 `cap_net_raw` 能力
编译

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

移动 `libSocketTester.so` 到/usr/lib
运行

sudo ldconfig

盖上盖子

cd /usr/lib
sudo setcap cap_net_raw=epi libSocketTester.so

创建 `Test.java` 班

public static void main(final String[] args) {
SocketTester tester = new SocketTester();
tester.socketTest();
}

创建一个带有 `SocketTester.java` 以及 `Test.java` 运行测试

java -cp socketTester.jar Test


### 我已经试过了

#### 在.so库中添加cap

sudo setcap cap_net_raw=epi libSocketTester.so

结果:失败

#### 向java添加cap

sudo setcap cap_net_raw=epi /usr/lib/jvm/java-14-openjdk-amd64/bin/java

结果:它可以工作,但这不是我想要的,因为现在所有java进程都有了这个功能(请参见目标部分中的粗体部分)。

### 问题

为什么要把帽子加在table上 `.so` 不起作用?我还能怎样实现这个目标?

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题