2010-06-14 34 views
6

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?

+0

"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. –

Respuesta

1

Intente utilizar un puerto superior a 1024, o ejecute como root.

+1

Los puertos inferiores a 1024 tienen privilegios y solo se puede acceder a ellos desde la raíz. –

0

¿Alguna actualización?

Puede encontrar algunas respuestas en el proyecto jsvc de Apache Commons-Daemon: "... un conjunto de bibliotecas y aplicaciones para hacer que las aplicaciones Java se ejecuten en UNIX más fácilmente".

Se utiliza capacidades, aunque no permiten al usuario seleccionar cuál aplicar, por razones de portabilidad, supongo.

Cuestiones relacionadas