Выполнение привилегированных команд оболочки в Java - PullRequest
0 голосов
/ 13 июня 2019

Это простой код, который я сделал, чтобы разрешить выполнение команд оболочки:

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.io.File;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

@RestController
public class ShellController {

    @RequestMapping(value = "/shell", method = RequestMethod.POST)
    public Response postFile(@RequestParam(value = "command") String command) {
        try {
            boolean isWindows = System.getProperty("os.name")
                    .toLowerCase().startsWith("windows");
            ProcessBuilder builder = new ProcessBuilder();
            if (isWindows) {
                builder.directory(new File(System.getProperty("user.home")));
                builder.command("cmd.exe", "/c", command);
            } else {
                builder.directory(new File(System.getenv("HOME")));
                builder.command("sh", "-c", command);
            }
            Process process = builder.start();
            StringConsumer consumer = new StringConsumer();
            StreamGobbler streamGobbler =
                    new StreamGobbler(process.getInputStream(), consumer);
            Executors.newSingleThreadExecutor().submit(streamGobbler);
//          int exitCode = process.waitFor();
//          assert exitCode == 0;
            if(process.waitFor(3, TimeUnit.SECONDS)) {
                return new Response(0, consumer.getConsumed());

            }
            return new Response(-1, consumer.getConsumed());
        } catch (Exception e) {
            return new Response(-1, e.getMessage());
        }
    }

}

Выполнение этой программы в ОС Windows работает нормально, но не работает правильно при запуске из ОС Linux, вотпример конечной точки:

http://127.0.0.1:8686/shell?command="ls"

Проблема в том, что при запуске mkdir или даже rm это не работает, моя конечная цель здесь заключается в

  • Записать файл впуть, который ограничен с помощью sudo
  • Удалить файл с указанным путем (sudo)
  • Выполнить команду для запуска / остановки сервера (например, nginx -s reload)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...