Почему команда cd не работает с использованием Java JSch?

avatar
BenG
9 марта 2020 в 20:59
802
3
1

Я только изучаю Java и Jsch и могу заставить его запускать другие команды, но не cd. Код ошибки, возвращаемый функцией sendCommand SSHManager, не равен нулю, а представляет собой некоторую нечитаемую строку, которая каждый раз меняется (возможно, это означает, что она пуста, что не так хорошо знакомо с внутренней работой Java).

Есть идеи, почему бы и нет? Аналогичный вопрос здесь JSch - Почему CD не работает?, но без ответа.

Я не буду копировать и вставлять сюда весь класс SSHManager - полезный ответ с полным кодом здесь, которому я пытаюсь следовать. Выполнить команду через SSH с JSch

Пример кода ниже:

import SSH.SSHManager;
public class src
{
    int ERROR = 0;
    public static void main(String[] args)
    {
        String username = "debian";
        String password = "temppwd";
        String ipadd = "192.168.7.2";
        SSHManager ssh = new SSHManager(username, password, ipadd, "");
        ssh.connect();

        String out = "";

        //this doesn't work, printing output as bytes to show how weird it is
        out = ssh.sendCommand("cd Desktop");
        System.out.println(out.getBytes());

        //some other test commands
        out = ssh.sendCommand("mkdir test");
        System.out.println(out);
        out = ssh.sendCommand("ls");
        System.out.println(out);
        ssh.sendCommand("logout");
    }
}

Вывод из консоли Eclipse (bin и Desktop уже находятся в корневом каталоге):

[B@b065c63

bin
Desktop
test
Источник

Ответы (3)

avatar
Martin Prikryl
10 марта 2020 в 06:29
1

Каждая команда, выполняемая по SSH-каналу "exec" (что находится за SSHManager.sendCommand), выполняется в своей собственной оболочке. Таким образом, команды не влияют друг на друга.

Чтобы выполнить несколько команд в одной оболочке, просто используйте соответствующий синтаксис оболочки вашего сервера. В большинстве оболочек * nix используется точка с запятой или двойной амперсанд (с другой семантикой).

В вашем случае больше подходит двойной амперсанд.

cd Desktop && mkdir test && ls

См. Также Несколько команд с использованием JSch.


Однако, если вы хотите прочитать вывод команд, у вас возникнут проблемы с различением, где заканчивается вывод одной команды и начинается вывод следующих команд. Позвольте только если вы хотите проверить код выхода команды.

Тогда лучше выполнять каждую команду в ее собственном канале "exec" способом, не требующим контекста. В вашем случае это означает использование полных путей:

mkdir Desktop/test
ls Desktop

См. Также Как выполнять несколько операций с JSch.


Кроме того, поскольку вы собирались использовать только операции с файлами, вам вообще не следует выполнять команды оболочки. Используйте стандартный SSH API для работы с файлами, SFTP.

avatar
Lee David Painter
9 марта 2020 в 23:38
0

Я ответил на аналогичный вопрос Использование клиента SSH java jcabi (или другого) для выполнения нескольких команд в оболочке

Мой API с открытым исходным кодом Maverick Synergy имеет высокоуровневый API для выполнения нескольких команд в оболочке. В настоящее время он разработан и хорошо работает с оболочками типа bash.

avatar
Horatiu Jeflea
9 марта 2020 в 21:20
0

На вопрос есть своего рода ответ в комментариях. Каждая команда в sendCommand использует свою собственную «трубу», поэтому она отключается и запускается заново в каждой из них.

Быстрое решение - отправить несколько команд в одной sendCommand, например:

out = ssh.sendCommand("cd Desktop; mkdir test; ls; logout");

Но правильный способ - использовать сеанс, например https://coderhelper.com/a/9269234/290036

Martin Prikryl
15 октября 2020 в 08:49
0

Нет, это не правильный путь. Сеанс оболочки не следует использовать для автоматизации. В конце концов, это принесет вам много проблем.