Это простой код, который я сделал, чтобы разрешить выполнение команд оболочки:
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
)