我已经完成了一个 Java 库,它使用带有 JNI 的 C 库。C库在linux中编译成.so文件。这个库需要cap_net_raw 能力。
执行一个没有额外权限的java 进程,该进程使用所述 java 库。将使用该库的实际进程是产品中已经存在的进程,我们不想授予它们更多权限。
为了测试这一点,我创建了一个jar并在使用和不使用sudo. 正如预期的那样,使用它会成功,但如果没有它,它就会失败。
SocketTester.javastatic {
System.loadLibrary("SocketTester");
}
private native int socketTest();
Run Code Online (Sandbox Code Playgroud)
socketTester.h使用命令生成文件javac -h . SocketTester.java
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
libSocketTester.so到/usr/libsudo ldconfig
Run Code Online (Sandbox Code Playgroud)
cd /usr/lib
sudo setcap cap_net_raw=epi libSocketTester.so
Run Code Online (Sandbox Code Playgroud)
Test.java类public static void main(final String[] args) …Run Code Online (Sandbox Code Playgroud)