Команда Java не выполняется

1

У меня есть Java-приложение, которое должно выполнить команду sh.
Моя команда выглядит как sudo/bin/sh -c "echo 7 >/sys/class/gpio/export" и когда я sudo/bin/sh -c "echo 7 >/sys/class/gpio/export" ее в командной строке моего компьютера, она работает, но не с моей Java-программой.

Строка Programm выглядит так:

System.out.println(CmdExecutor.execute("sudo /bin/sh -c \"echo 7 > /sys/class/gpio/export\""));


public class CmdExecutor {

public static String execute(String[] cmd) {
    StringBuffer output = new StringBuffer();

    Process p;
    try {
        p = Runtime.getRuntime().exec(cmd);
        p.waitFor();
        BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));

        String line = "";
        while ((line = reader.readLine()) != null) {
            output.append(line).append("\n");
        }

    } catch (IOException | InterruptedException e) {
    }

    return output.toString();
}

public static String execute(String cmd) {
    StringBuffer output = new StringBuffer();

    Process p;
    try {
        p = Runtime.getRuntime().exec(cmd);
        p.waitFor();
        BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));

        String line = "";
        while ((line = reader.readLine()) != null) {
            output.append(line).append("\n");
        }

    } catch (IOException | InterruptedException e) {
    }

    return output.toString();
}

}

Кто-нибудь может мне помочь?

  • 0
    попробуй .... exec (cmd.toString ());
  • 3
    Я уверен, что вам нужно предоставить пароль, когда вы sudo.
Показать ещё 5 комментариев
Теги:

1 ответ

0
Лучший ответ

Я вижу два вопроса:

  • Несколько аргументов необходимо разделить на Java.
  • Аутентификация с помощью sudo.

Несколько аргументов необходимо разделить.

Если вы запустите exec("ab"), система будет искать команду ab как одно имя команды String.

Если вы запустите exec("a", "b"), the system will look for a command named a and pass b 'в качестве аргумента этой программе.

Итак, вы должны execute("sudo", "/bin/sh", "-c", "echo 7 >/sys/class/gpio/export").

sudo может потребовать аутентификации

Когда вы выполняете команды с помощью sudo, будет выполнена аутентификация. Если вы выполняете несколько команд sudo из одного и того же процесса, система будет кэшировать аутентификацию для удобства, но в основном требуется аутентификация.

Аутентификация с помощью sudo обычно означает, что вам необходимо указать пароль.

Причина, почему вы sudo в том, что /sys/class/gpio/export имеет разрешение -w------- (200) принадлежит root root, который означает, что никто не может читать и только корень может писать.

У вас есть несколько вариантов:

  • Измените разрешения этого файла, чтобы все могли его написать (не рекомендуется): chmod a+w/sys/class/gpio/export.
  • Измените разрешения этого файла, чтобы пользователь мог написать его: setfacl -m user:cher:w/sys/class/gpio/export - обратите внимание, что это работает только в том случае, если ваши sysfs смонтированы с помощью опции acl и обычно это не так. Я не знаю, возможно ли установить sysfs с опцией acl, я сам не пробовал.
  • Выполните пароль для команды sudo: exec("echo password | sudo/bin/sh -c \"echo 7 >/sys/class/gpio/export\"") ПРЕДУПРЕЖДЕНИЕ ЭТО ОПАСНО !!!
  • Используйте графическую замену sudo например, kdesudo
  • Измените конфигурацию sudoers чтобы пользователь, о котором идет речь, никогда не должен вводить пароль для sudo - не рекомендуется.
  • 0
    Спасибо за ваш ответ. Мне не нужно было ни аутентификации, ни смены владельца каталога. Я только изменил String на String-Array "sudo", "/bin/sh", "-c", "echo 7 > /sys/class/gpio/export"
  • 0
    Я обновил ответ. Я оставил часть sudo для справки, на случай, если у других возникнут аналогичные проблемы.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню