2010-06-14 22 views
6

Sto sperimentando con le funzionalità di Linux per l'applicazione java. Non voglio per aggiungere funzionalità a Interpreter (JVM), così ho provato a scrivere un semplice involucro (con le informazioni di debug stampati a stdout):Funzionalità e Linux e 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); 
} 

In questo modo, posso vedere che la capacità è fissata per questo eseguibile:

./runner: running with caps = cap_net_bind_service+p 

E getcap mostra

runner = cap_net_bind_service+ip 

ho la capacità impostato per essere ereditabile, quindi non ci dovrebbero essere problemi. Tuttavia, java non vuole ancora collegarsi alle porte privilegiate.

sto ottenendo questo errore:

sun/nio/ch/Net.java:-2:in `bind': java.net.SocketException: Permission denied (NativeException) 

qualcuno può aiutarmi a risolvere questo?

+0

"java continua a non collegarsi alle porte privilegiate": quale messaggio di errore ricevi? È possibile che l'implementazione JRE esegua il proprio (errato) controllo per 'uid == 0' prima che tenti di collegarsi a una porta privilegiata. –

risposta

1

Provare a utilizzare una porta sopra 1024 o eseguire come utente root.

+1

Le porte inferiori a 1024 sono privilegiate e sono accessibili solo da root. –

0

Qualche aggiornamento?

È possibile trovare alcune risposte nel progetto jsvc di Commons-Daemon Apache: "... set di librerie e applicazioni per rendere le applicazioni Java eseguite su UNIX più facilmente."

Si utilizza le funzionalità, anche se non consentono all'utente di selezionare quale applicare, per ragioni di portabilità suppongo.