Я экспериментирую с возможностями Linux для Java-приложения. Я не хочу добавлять возможности в интерпретатор (JVM), поэтому я попытался написать простую оболочку (с выводом отладочной информации на стандартный вывод):
#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)
Может кто-нибудь помочь мне решить эту проблему?