Estoy experimentando con las capacidades de Linux para la aplicación Java. No quiero añadir capacidades al intérprete (JVM), así que traté de escribir una simple envoltorio (con información de depuración en la salida estándar):Capacidades y Linux y Java
#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);
}
De esta manera, puedo ver que la capacidad se establece para este ejecutable:
./runner: running with caps = cap_net_bind_service+p
Y getcap
muestra
runner = cap_net_bind_service+ip
tengo el conjunto de capacidades que ser hereditaria, por lo que no debería haber ningún problema. Sin embargo, java aún no quiere vincularse a los puertos con privilegios.
estoy recibiendo este error:
sun/nio/ch/Net.java:-2:in `bind': java.net.SocketException: Permission denied (NativeException)
Alguien me puede ayudar a resolver esto?
"java todavía no desea enlazar a puertos con privilegios": ¿Qué mensaje de error obtiene? Es posible que su implementación de JRE haga su propia comprobación (incorrecta) para 'uid == 0' antes de intentar vincularse a un puerto con privilegios. –