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();
}
}