我正在尝试开发一个用于与某些程序交互的界面。 我有一台Windows计算机,它将保存界面,还有一个Raspberry Pi,它将启动程序。
我将通过SSH使用它们,但随后与之交互:
这是2 raspberrys之间的无线通信!
事实上,通过任何Expect库(expectJ,expect4J,expectIt)启动程序没有任何困难,但我总是无法输入消息。
架构是:
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()
有人有想法吗?
谢谢!
答案 0 :(得分:0)
Per @aeldred:我成功了!如果有人搜索同样的问题,那就是程序执行的调用失败了,不得不用ChannelExec替换我的频道,我的exec方法变成:
public void exec(String prog) {
try {
channelExec.setCommand(prog);
channelExec.connect();
} catch (Exception e) {
e.printStackTrace();
}
}