Команда Sudo работает в unix, но не из java-кода

Я запускаю команду unix sudo, и она отлично работает там. sudo -u xfbcft -i
Проблема в том, что когда я пытаюсь использовать то же, что и конструктор java-процессов, я получаю исключение с отказом в разрешении в Unix.

public class Test {
public static void main(String args[]){
    System.out.println("Going to execute:");
    runUnixComand();
}

private static void runUnixComand() {
    Process p;
    StringBuffer output = new StringBuffer();

    try {
        String [] cmdArray  = {"sudo -u xfbcft -i ","cftping -v","exit"};

        ProcessBuilder builder = new ProcessBuilder(cmdArray);
        builder.redirectErrorStream(true);
        //builder.redirectOutput();
        Process process = builder.start();
        InputStream is = process.getInputStream();
        BufferedReader reader = new BufferedReader(new InputStreamReader(is));

        String line = null;
        while ((line = reader.readLine()) != null) {
            System.out.println("op:"+line);
        }
    } catch (Exception e) {
        System.out.println(e);
        e.printStackTrace();
    }
}}

Ниже приведена строка исключения, которую я получаю в терминале Unix.

java.io.IOException: Cannot run program "sudo -u xfbcft -i ": error=13, Permission denied
java.io.IOException: Cannot run program "sudo -u xfbcft -i ": error=13, Permission denied
        at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
        at JdbcTest.runUnixComand(JdbcTest.java:23)
        at JdbcTest.main(JdbcTest.java:8)
Caused by: java.io.IOException: error=13, Permission denied
        at java.lang.UNIXProcess.forkAndExec(Native Method)
        at java.lang.UNIXProcess.<init>(UNIXProcess.java:247)
        at java.lang.ProcessImpl.start(ProcessImpl.java:134)
        at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)

Примечание: у меня есть записи в файле sudoers, и отдельные команды отлично работают в unix. Кроме того, пользователь, запускающий эту Java-программу, и отдельная команда одинаковы. Пожалуйста, руководство.

У вашего пользователя установлен NOPASSWD?

ᴘᴀɴᴀʏɪᴏᴛɪs 20.09.2018 16:10

sudo не может запросить пароль, если вы не подключите стандартный ввод. Хотя вместо этого рассмотрите возможность запуска java-программы как sudo.

killjoy 20.09.2018 16:10

На самом деле Sudo откажется принимать пароль через стандартный ввод (он напрямую взаимодействует с / dev / tty). Вы можете подделать это с помощью pty, но использование NOPASSWD, вероятно, будет гораздо лучшим решением. Кроме того, не используйте sudo -i, если вы не работаете в интерактивном режиме! Вместо этого вы хотите просто выполнить sudo -u xfbcft cftping -v как одну команду.

Daniel Pryden 20.09.2018 16:41

Здесь может быть что-то более фундаментальное: похоже, вы получаете ошибку отказа в разрешении непосредственно от forkAndExec. Может быть, вам нужно использовать полный путь к исполняемому файлу sudo?

Daniel Pryden 20.09.2018 16:45

да, я установил NOPASSWD, и он работает с машины

Tukaram Bhosale 21.09.2018 17:42
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
5
177
1

Ответы 1

Я изменил свой код, как показано ниже, и он работает как шарм.

ProcessBuilder builder = new ProcessBuilder("/bin/sh", "-c", "sudo -H -u xfbcft -i");
            builder.redirectErrorStream(true);

так что нужно было выполнить его из bin / sh

Другие вопросы по теме