我正在用 Java 编写一个服务器程序,允许用户使用 DRMAA 提交作业。尽管主服务器进程以 root
运行,但它所做的只是对用户进行身份验证,然后启动另一个以该用户运行的 Java 程序并实际执行工作,以遵守最小化特权的原则。最初,我使用 Runtime.exec()
和 sudo
(下面的示例)来执行此操作,直到进程被守护,此时 sudo
很生气,因为它没有终端。
String[] command = {"sudo", "-i", "-u", username, java, theOtherJavaProgram};
Runtime.getRuntime().exec(command, null, getHomeDirectory(username));
当作为守护进程运行时,在 Java 中执行这种 fork 和删除特权模式的最佳方法是什么?有办法吗?我是否必须突破 C 并学习如何使用 JNI 创建 JVM?
最佳答案
使用 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
是使用 javah
从 UID.class
生成的机器。
关于java - 使用 Java fork 和删除特权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5140131/