Установите umask перед запуском процесса с JAVA

Я бы добавил umask перед запуском процесса с java, но API процесса java (я использую java 9) не предоставляет метод для установки umask.

Я попытался запустить процесс, выполнив umask со значением, которое позволяет мне создавать, но не читать (0644). это не работает ...

Optional<String> umask = ProcessUtil.getUmask();
if (!umask.isPresent()) {
    this.restartOnFail();
    return;
}
ProcessUtil.setUmask(parent.config.umask);
this.timeAtLaunch = System.currentTimeMillis();
this.status = ProcessStatus.LAUNCHING;
this.process = pb.start();
this.onExitProcess();
ProcessUtil.setUmask(umask.get());

Код setUmask:

public static void setUmask(String mask) {
    try {
        String[] commands = {"umask", mask};
        Process exec = Runtime.getRuntime().exec(commands);
        exec.waitFor();
    } catch (Exception e) {
        Server.global.logErr("Impossible to set umask for %s.", mask);
    }
}

Я пытался это сделать, и, похоже, это не сработало (я запустил процесс, который создает файл и читает его, а он должен просто создать его и выдать ошибку при чтении). потому что процесс создал файл, в котором не было разрешения, установленные umask. Он смог прочитать файл, чего не должно было произойти...

Я создал готовый исполняемый класс:

import java.io.*;

public class StackOverFlowTest {

    public static void setUmask(String mask) {
        try {
            String[] commands = {"umask", mask};
            Process exec = Runtime.getRuntime().exec(commands);
            exec.waitFor();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void runCommand(String [] command) throws IOException, InterruptedException {
        Runtime rt = Runtime.getRuntime();
        Process proc = rt.exec(command);
        BufferedReader stdInput = new BufferedReader(new InputStreamReader(proc.getInputStream()));
        BufferedReader stdError = new BufferedReader(new InputStreamReader(proc.getErrorStream()));
        String s = null;
        while ((s = stdInput.readLine()) != null) {
            System.out.println("stdout: " + s);
        }
        while ((s = stdError.readLine()) != null) {
            System.out.println("stderr: " + s);
        }
        proc.waitFor();
    }

    public static void main(String[] args) {
        setUmask("0644"); // set this permission -----w--w-

        String[] create = {"touch", "file.stackoverflow"};
        String[] read = {"cat", "file.stackoverflow"};

        try {
            runCommand(create);
            runCommand(read);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Этот код на самом деле не показывает никаких ошибок при запуске cat, и это проблема!

(Извините за мой английский)

Итак, есть кто-нибудь, у кого есть совет, как запустить процесс с некоторыми разрешениями с помощью java?


person Alexis Viscogliosi    schedule 31.03.2018    source источник
comment
К сведению: когда вы вызываете exec(), он запускает новый процесс, поэтому команда umask изменит только этот процесс, процесс, на котором выполняется Java.   -  person Andreas    schedule 31.03.2018
comment
Даже если этот вопрос помечен как дублированный, у меня все еще нет ответа, это stackoverflow ... Я понял это, и поэтому я спрашиваю, есть ли у кого-нибудь совет?   -  person Alexis Viscogliosi    schedule 31.03.2018
comment
Это не решение, потому что многим процессам нужны разные umask.   -  person Alexis Viscogliosi    schedule 31.03.2018