能力 & Linux & Java

6

我正在尝试使用Linux功能来运行Java应用程序。我不想在解释器(JVM)中添加功能,因此我尝试编写一个简单的包装器(带有打印到stdout的调试信息):

#include <stdio.h>
#include <stdlib.h>
#include <sys/capability.h>
#include <unistd.h>

int main(int argc, char *argv[]){
        cap_t cap = cap_get_proc();

        if (!cap) {
                perror("cap_get_proc");
                exit(1);
        }
        printf("%s: running with caps %s\n", argv[0], cap_to_text(cap, NULL));

        return execlp("/usr/bin/java", "-server", "-jar", "project.jar", (char *)NULL);
}

通过这种方式,我可以看到此可执行文件的功能已设置:

./runner: running with caps = cap_net_bind_service+p

getcap 显示

runner = cap_net_bind_service+ip

我已将能力设置为可继承,所以不应该有问题。然而,Java仍然无法绑定到特权端口。
我收到了以下错误提示:
sun/nio/ch/Net.java:-2:in `bind': java.net.SocketException: Permission denied (NativeException)

有人能帮我解决这个问题吗?


"Java仍然不想绑定到特权端口": 您收到了什么错误消息?您的JRE实现在尝试绑定到特权端口之前可能会进行自己(错误的)uid==0检查。 - Joachim Sauer
2个回答

1

尝试使用1024以上的端口,或以root身份运行。


1
端口号1024以下是特权端口,只能由root用户访问。 - Mark Robinson

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接