Почему команда cd не работает с Java Jsch? - PullRequest
1 голос
/ 09 марта 2020

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

Любая идея, почему не? Подобный вопрос здесь JSch - Почему CD не работает? , но без ответа.

Я не буду копировать и вставлять весь класс SSHManager здесь - полезный ответ с полным кодом, что я пытаясь следовать. Выполнить команду через S SH с 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 уже есть в root каталог):

[B@b065c63

bin
Desktop
test

Ответы [ 3 ]

0 голосов
/ 10 марта 2020

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

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

0 голосов
/ 10 марта 2020

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

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

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

cd Desktop && mkdir test && ls

См. Также Несколько Команды, использующие JSch .


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

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

mkdir Desktop/test
ls Desktop

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

0 голосов
/ 10 марта 2020

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

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

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

Но правильный способ - использовать сеанс, например { ссылка }

...