У меня есть 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();
}
}
Кто-нибудь может мне помочь?
Я вижу два вопроса:
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
, я сам не пробовал.exec("echo password | sudo/bin/sh -c \"echo 7 >/sys/class/gpio/export\"")
ПРЕДУПРЕЖДЕНИЕ ЭТО ОПАСНО !!!sudo
например, kdesudo
sudoers
чтобы пользователь, о котором идет речь, никогда не должен вводить пароль для sudo
- не рекомендуется."sudo", "/bin/sh", "-c", "echo 7 > /sys/class/gpio/export"
sudo
для справки, на случай, если у других возникнут аналогичные проблемы.