使用Java分叉特权

时间:2011-02-28 09:26:53

标签: java unix process permissions fork

我正在用Java编写一个服务器程序,允许用户使用DRMAA提交作业。虽然主服务器进程以root运行,但它只是对用户进行身份验证,然后启动另一个以该用户身份运行的Java程序,并实际完成工作以符合最小化权限的原则。最初,我使用Runtime.exec()sudo(下面的示例)执行此操作,该工作正常,直到进程被重新监控,此时sudo因为没有终端而感到沮丧。

String[] command = {"sudo", "-i", "-u", username, java, theOtherJavaProgram};
Runtime.getRuntime().exec(command, null, getHomeDirectory(username));

作为守护程序运行时,在Java中执行此分支特权模式的最佳方法是什么?有办法吗?我是否必须打破C并学习如何使用JNI创建JVM?

3 个答案:

答案 0 :(得分:6)

使用JNI删除权限可能更容易。

这是我之前被淘汰的那个:

UID.java

public class UID {

    public static native int setuid(int uid);

    static {
        System.loadLibrary("uid");
    }
}

unix_uid.c

#include <sys/types.h>
#include <unistd.h>
#include <jni.h>
#include "UID.h"

JNIEXPORT jint JNICALL
Java_UID_setuid(JNIEnv * jnienv, jclass j, jint uid)
{
    return((jint)setuid((uid_t)uid));
}

UID.h是使用UID.classjavah生成的机器。

答案 1 :(得分:1)

您可以使用su(1)代替sudo(8)su(1)涉及的内容少得多,可能不会想要终端本身。 (当然,如果您的PAM配置需要su(1)的终端输入,那么这可能也无法正常工作。)

答案 2 :(得分:0)

如果想要以root开始非root流程,那么su就足够了。将 root转到另一个用户时,它不会要求输入密码,因此不需要终端。