Как я могу выполнить эту команду правильным способом в сервлете Java - PullRequest
0 голосов
/ 15 января 2019

Я, вероятно, ошибаюсь в синтаксисе с этим, или я просто понятия не имею, как я могу выполнить эту команду.

        String ipAddress = request.getRemoteAddr();

        System.out.println(ipAddress);

        String[] command = {"sudo iptables -t nat -I PREROUTING 1 -s "+ipAddress+" -p tcp -m tcp --dport 80 -j ACCEPT && sudo iptables -t nat -I PREROUTING 2 -s "+ipAddress+" -p tcp -m tcp --dport 443 -j ACCEPT"};
        ProcessBuilder probuilder = new ProcessBuilder(command);

        Process process = probuilder.start();

        //Read out dir output
        InputStream is = process.getInputStream();
        InputStreamReader isr = new InputStreamReader(is);
        BufferedReader br = new BufferedReader(isr);
        String line;
        System.out.printf("Output of running %s is:\n",
                Arrays.toString(command));
        while ((line = br.readLine()) != null) {
            System.out.println(line);
        }

        //Wait to get exit value
        try {
            int exitValue = process.waitFor();
            System.out.println("\n\nExit Value is " + exitValue);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

Это две команды для вставки правила iptables, когда кто-то успешно входит в систему на моем сервере Tomcat (localhost), который работает на Raspberry pi. На моем Mac он возвращает ошибку исключения, когда я пытаюсь войти в систему на моем телефоне, он не дает мне доступ в интернет (когда я проверяю iptables на пи, там ничего не вставлено).

1 Ответ

0 голосов
/ 15 января 2019

Есть несколько проблем с вашим кодом. Конструктор ProcessBuilder принимает список аргументов следующим образом:

Process p = new ProcessBuilder("myCommand", "myArg").start();

см. ProcessBuilder Javadoc . В вашем случае sudo - это команда, а остальные - аргументы. Если у вас есть хотя бы Java 7, вы можете перенаправить вывод команды, используя метод inheritIO.

 ProcessBuilder probuilder = new ProcessBuilder().inheritIO().command("myCommand", "myArg");

Проверьте это для подробного обсуждения.

Во-вторых, вы должны указать полный путь к исполняемому файлу (т.е. /usr/bin/sudo вместо sudo), иначе он не сможет его найти.

Быстрое исправление вашего кода должно выглядеть следующим образом:

String[] command = { "/usr/bin/sudo iptables -t nat -I PREROUTING 1 -s " + ipAddress
        + " -p tcp -m tcp --dport 80 -j ACCEPT " };
String[] commands = command[0].split(" ");
ProcessBuilder probuilder = new ProcessBuilder(commands);

Подобный вопрос здесь .

Надеюсь, это поможет.

...