У меня есть код 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 не работают. Пожалуйста, помогите.