Java 作为另一个用户加载进程?

Java 作为另一个用户加载进程?,java,c,linux,unix,Java,C,Linux,Unix,因此,我有一个根进程(以根运行),我希望它加载另一个带有非根uid的进程 目前,我正在调用seteuid和setegid,然后在创建进程后重置为root。我发现进程仍然加载root的uid。我应该用什么来做这个 Java代码(JNA): 我按照Brian的建议做了,使用另一个进程来设置UID,然后执行我的东西。你说的“加载另一个进程”是什么意思?与其描述你在做什么,不如向我们展示代码。它不必是实际的代码,但a会很好。好吧,我的代码实际上是Java调用JNA,所以我认为这不会有多大帮助。我马上就发

因此,我有一个根进程(以根运行),我希望它加载另一个带有非根uid的进程

目前,我正在调用
seteuid
setegid
,然后在创建进程后重置为root。我发现进程仍然加载root的uid。我应该用什么来做这个

Java代码(JNA):


我按照Brian的建议做了,使用另一个进程来设置UID,然后执行我的东西。

你说的“加载另一个进程”是什么意思?与其描述你在做什么,不如向我们展示代码。它不必是实际的代码,但a会很好。好吧,我的代码实际上是Java调用JNA,所以我认为这不会有多大帮助。我马上就发@joachimpileborg C中的“正确”解决方案是
fork
,完全使用
setuid
拥有子级删除权限,然后执行所需的进程。不过,我不知道您是否可以在Java中使用fork或exec。@Brian可能不会,但我想我可以生成一个中间进程,
setuid
,然后生成另一个进程。
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;
}