Команда Runtime.getRuntime (). Exe c завершается ошибкой со статусом выхода 127 для всех действий root - PullRequest
0 голосов
/ 18 июня 2020

У меня есть код java, в котором выполняется команда s sh с использованием Runtime.getRuntime().exec. Ниже приведен код:

package somepackage

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;


public class Nodes {

    protected String ip = "1.2.3.4";
    private String privateKeyPath = "src/test/resources/devopskey";
    private String username = "devops";
    Logger log = LoggerFactory.getLogger(Class.class.getName());

    public void executeCommand(String command) {
        try {
            log.info("Executing command " + command + " on " + this.ip);
            String ssh = "ssh -i " + privateKeyPath + " " + username + "@" + this.ip;
            String cmd = ssh + " \"" + command + "\"";
            log.info("Executing: " + cmd);
            Process process = Runtime.getRuntime().exec(cmd);

            StringBuilder output = new StringBuilder();
            BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
            String line;
            while ((line = reader.readLine()) != null) {
                output.append(line).append("\n");
            }

            log.info(output.toString());
            int exitStatus = process.waitFor();
            log.info("Exit status: " + exitStatus);
            if (exitStatus != 0) {
                log.error("Failed to execute command: " + command + " on ip: " + this.ip);
            }
            else
                log.info("Command executed successfully");


        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }


    }

    public static void main(String[] args) {
        new Nodes().executeCommand("sudo ls /root");
    }
}

Я получаю следующий результат:

23:20:08.512 [main] INFO java.lang.Class - Executing command ls /root on 1.2.3.4
23:20:08.538 [main] INFO java.lang.Class - Executing: ssh -i src/test/resources/devopskey devops@1.2.3.4 "sudo ls /root"
23:20:10.078 [main] INFO java.lang.Class - 
23:20:10.084 [main] INFO java.lang.Class - Exit status: 127
23:20:10.084 [main] ERROR java.lang.Class - Failed to execute command: ls /root on ip: 1.2.3.4

То же самое, если я запускаю на своем локальном компьютере, ниже вывод:

joshi-mac$ ssh -i src/test/resources/devopskey devops@1.2.3.4 "sudo ls /root"
buildPlane.deb
node-v10.16.3-linux-x64
node-v10.16.3-linux-x64.tar.xz

В коде java, если я изменю параметры команды только на ls вместо sudo ls /root, он будет работать нормально. Также, если я использую ls /root, я получаю ту же проблему, что и exit-status 127 . Все действия с разрешением root не работают. Пожалуйста, помогите.

Ответы [ 2 ]

0 голосов
/ 18 июня 2020

Проблемы с exe c в Java часто возникают из-за использования версии exec(String) вызовов и команд bash / SHELL. Поэтому в первую очередь попробуйте передать команду как версию String [], чтобы быть более уверенным, что Java передает правильные аргументы выполняемой команде:

String[] arr = new String[] {"ssh","-i ", privateKeyPath, username + "@" + this.ip, command};
Process process = Runtime.getRuntime().exec(arr);

// ... or as ProcessBuilder is used by Runtime.exec:
Process process = new ProcessBuilder(arr); 

Следующая проблема может быть связана с учетная запись / среда на удаленном компьютере. Попробуйте использовать «ls» как полный путь «/ bin / ls» или явно сослаться на оболочку «/ bin / bash - c 'sudo ls / root'» может помочь.

0 голосов
/ 18 июня 2020

Используйте класс ProcessBuilder для выполнения любого файла batch / sh или команды ОС вместо класса Runtime.

ProcessBuilder processBuilder = new ProcessBuilder(comandAndargList);
...