2015-05-15 17 views
5

Mam więc proces root (działający jako root) i chcę załadować inny proces z użytkownikiem innym niż root.Ładowanie procesu jako inny użytkownik?

W tej chwili dzwonię pod numer seteuid i setegid, a następnie po ponownym utworzeniu procesu następuje resetowanie do katalogu głównego. Zauważyłem, że proces wciąż trwa z uid root. Co powinienem użyć, aby to zrobić?

kod Java (JNA):

public boolean loadVHost(String java, File sockfile) throws IOException { 
    if (CLib.INSTANCE.setegid(suid) != 0) { 
     log("setegid C call failed! @ " + id); 
     return false; 
    } 
    if (CLib.INSTANCE.seteuid(suid) != 0) { 
     log("seteuid C call failed! @ " + id); 
     return false; 
    } 
    if (CLib.INSTANCE.getegid() != suid || CLib.INSTANCE.geteuid() != suid) { 
     log("geteuid/egid C call returned unwanted value! @ " + id + " (returned " + CLib.INSTANCE.getuid() + ":" + CLib.INSTANCE.getgid() + ")"); 
     return false; 
    } 
    File hp = new File(homepath); 
    hp.mkdirs(); 
    File avuna = new File(hp, "avuna.jar"); 
    File main = new File(hp, "main.cfg"); // TODO: add linux user-based RAM/HDD/bandwidth caps 
    File hosts = new File(hp, "hosts.cfg"); 
    if (!avuna.exists() || !main.exists() || !hosts.exists()) { 
     log("VHost corrupted, avuna.jar/main.cfg/hosts.cfg is missing! Reinstalling..."); 
     // if (createVHost(java, sockfile.getAbsolutePath())) { 
     // log("Reinstallation completed, vhost loading..."); 
     // }else { 
     // log("Reinstallation failed, vhost NOT loading."); 
     // return false; 
     // } 
    } 
    ProcessBuilder builder = new ProcessBuilder(java, "-Xmx" + maxram + "M", "-Xms16M", "-jar", avuna.getAbsolutePath(), main.getAbsolutePath()); 
    // TODO: if we want to be able to pass std input/output/err, this would be the place 
    builder.redirectErrorStream(true); 
    this.process = builder.start(); 
    if (CLib.INSTANCE.seteuid(0) != 0) { 
     log("[CRITICAL] setuid C call failed! @ " + id + ", the VHost was loaded, but we were NOT able to re-escalate!"); 
     return false; 
    } 
    if (CLib.INSTANCE.setegid(0) != 0) { 
     log("[CRITICAL] setgid C call failed! @ " + id + ", the VHost was loaded, but we were NOT able to re-escalate!"); 
     return false; 
    } 
    return true; 
} 
+0

Co masz na myśli mówiąc "załaduj kolejny proces"? – Brian

+0

Zamiast opisywać, co robisz, pomaga nam pokazując nam kod. Nie musi to być rzeczywisty kod, ale [Minimalny, kompletny i sprawdzalny przykład] (http://stackoverflow.com/help/mcve) byłoby miłe. –

+0

Cóż, mój kod jest w rzeczywistości wywoływaniem JNA JNA, więc pomyślałem, że to nie będzie bardzo pomocne. Wezmę to w ciągu sekundy. @JoachimPileborg – JavaProphet

Odpowiedz

0

Zrobiłem to, co Brian zasugerował, i wykorzystywane innego procesu setuid, a potem po prostu wykonany moje rzeczy.

Powiązane problemy