Команда sshpass не найдена, когда я запускаю ее в Java - PullRequest
1 голос
/ 06 июня 2019

Я пытаюсь запустить команду для чтения строки из файла внутри удаленного адреса (и я уверен, что файл там есть), эта команда работает, когда я запускаю ее на bash, но она не работает, когдаЯ запускаю его в своем java-коде.

    Runtime rt = Runtime.getRuntime();
    String[] command;
    String line;

    try {
        command = new String[] {"sh", "-c", "\"sshpass " + "-p " + password + " ssh " + user + "@" + ip + " 'cat " + file.getAbsolutePath() + "'\"" };

        Process mountProcess = rt.exec(command);

        mountProcess.waitFor();

        bufferedReader = new BufferedReader(new InputStreamReader(mountProcess.getInputStream()));
        while ((line = bufferedReader.readLine()) != null) {
            user_list.put(user, line);
        }
        bufferedReader.close();

        bufferedReader = new BufferedReader(new InputStreamReader(mountProcess.getErrorStream()));
        while ((line = bufferedReader.readLine()) != null) {
            LOGGER.debug("Stderr: " + line);
        }
        bufferedReader.close();
    } catch ...

В мой user_list строка не добавлена ​​(поэтому строка из getInputStream равна нулю), и я получаю следующую ошибку от регистратора в коде:

Stderr: sh: 1: sshpass: not found

Если я использую ту же самую команду в bash, она сработает и напечатает нужную мне строку.

sshpass -p password ssh remote@192.168.1.10 'cat /home/ID/ID'

Кто-нибудь знает, почему это происходит?спасибо!

Ответы [ 2 ]

2 голосов
/ 06 июня 2019

Я бы посоветовал вам не использовать sh для переноса команды. Попробуйте

command = new String[] {"sshpass", "-p", password, "ssh", user + "@" + ip, "cat " + file.getAbsolutePath() };

Если вам нужно использовать sh, то удалите двойные кавычки, экранированные из командной строки: вы отправляете их как буквенные символы:

command = new String[] {
    "sh", 
    "-c", 
    String.format("sshpass -p %s ssh %s@%s 'cat %s'", password, user, ip, file.getAbsolutionPath())
};

Если вы все еще получаете "команду не найдена", то вам нужно либо указать полный путь к sshpass, либо убедиться, что его каталог находится в вашем PATH.

0 голосов
/ 13 июня 2019

При выполнении этой команды с Java пользователь tomcat8 вместо root (при использовании в терминале bash)

Решение, которое работало для меня, включало несколько флагов:

String.format("/usr/local/bin/sshpass -p %s /usr/bin/ssh -q -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no %s@%s 'cat %s'", password, user, ip, file.getAbsolutePath());
...