Java Jsch и ожидайте: управляйте интерактивной программой через SSH

Я пытаюсь разработать интерфейс для взаимодействия с некоторыми программами. У меня есть компьютер с Windows, который будет поддерживать интерфейс, и Raspberry Pi, который будет запускать программы.

Я должен использовать их через SSH, но потом взаимодействовать с:

  • Из некоторых текстовых полей я получаю параметры для программ и запускаю их, подключенные к сеансу SSH. Программа остается в состоянии ожидания "введите сообщение:".
  • Затем пользователь должен иметь возможность ввести сообщение в другое текстовое поле с компьютера, чтобы использовать это сообщение в программе. Здесь проблема.

Это для беспроводной связи между 2 малинами!

На самом деле, у меня нет проблем с запуском программы через какую-либо библиотеку Expect (ExpectJ, Expect4J, ExitIt), но я всегда не могу ввести сообщение после.

Архитектура это:

public SSH(String host, String user, String password) throws Exception {
    connection = new JSch();
    try {
        session = connection.getSession(user, host, 22);
        session.setPassword(password);
        connection.setConfig("StrictHostKeyChecking", "no");
        session.connect();
        channel = session.openChannel("shell");
        channel.connect();
        expect = new ExpectBuilder()
                .withOutput(channel.getOutputStream())
                .withInputs(channel.getInputStream(), channel.getExtInputStream())
                .withEchoInput(System.out)
                .withEchoOutput(System.out)
                .withExceptionOnFailure()
                .build();
    } catch (JSchException e) {
        System.out.println(e.getMessage());
        throw new Exception("Error on session");
    }
}

public void exec(String prog) {
    try {
        expect.sendLine(prog);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

public String send(String cmd){
    try {
        expect.sendLine(cmd);
    } catch (IOException e) {
        e.printStackTrace();
    }
    return "";
}

Возвращение "" должно быть подтверждением, когда программа будет завершена. Но send() всегда терпит неудачу и вводит данные в виде командной строки linux...! Итак, я ищу решение, как "ожидание" ожидаемого экземпляра... Вот так:

SSH --
      |-./udp xxxxx
        -|"hello"
        -|"132"
      |-close()

У кого-нибудь есть идея?

Спасибо!

1 ответ

Пер @aeldred: мне удалось это сделать! Если кто-то ищет ту же проблему, это был вызов выполнения программы, который потерял связь, должен был заменить мой канал на ChannelExec, и мои методы exec стали такими:

 public void exec(String prog) {
        try {
            channelExec.setCommand(prog);
            channelExec.connect();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
Другие вопросы по тегам