java - 使用 Java fork 和删除特权

标签 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 中执行这种 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 是使用 javahUID.class 生成的机器。

关于java - 使用 Java fork 和删除特权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5140131/

相关文章:

linux - Docker 环境变量未正确传递

image - 如何在Unix命令行中显示多个图像?

android - 带有异步任务的简单进度条

c++ - C++ 中没有提升的语音识别或 msconfig

c# - 为什么在 OOP(例如 Java、C#)中使用 break/continue 标签是一种不好的做法?

java - 类型不兼容编译错误

unix - 杀死一个 Haskell 二进制文件

c - 为什么我的进程没有同时运行?

c# - 日志字段应该私有(private)静态的任何原因?

java - twitter4j result.nextquery() 再次给出第一页的结果