Я запускаю команду 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-программу, и отдельная команда одинаковы. Пожалуйста, руководство.
sudo не может запросить пароль, если вы не подключите стандартный ввод. Хотя вместо этого рассмотрите возможность запуска java-программы как sudo.
На самом деле Sudo откажется принимать пароль через стандартный ввод (он напрямую взаимодействует с / dev / tty). Вы можете подделать это с помощью pty, но использование NOPASSWD, вероятно, будет гораздо лучшим решением. Кроме того, не используйте sudo -i, если вы не работаете в интерактивном режиме! Вместо этого вы хотите просто выполнить sudo -u xfbcft cftping -v как одну команду.
Здесь может быть что-то более фундаментальное: похоже, вы получаете ошибку отказа в разрешении непосредственно от forkAndExec. Может быть, вам нужно использовать полный путь к исполняемому файлу sudo?
да, я установил NOPASSWD, и он работает с машины




Я изменил свой код, как показано ниже, и он работает как шарм.
ProcessBuilder builder = new ProcessBuilder("/bin/sh", "-c", "sudo -H -u xfbcft -i");
builder.redirectErrorStream(true);
так что нужно было выполнить его из bin / sh
У вашего пользователя установлен
NOPASSWD?