Java Jsch并期望:通过SSH

时间:2015-08-06 09:54:36

标签: java swing expect jsch expectit

我正在尝试开发一个用于与某些程序交互的界面。 我有一台Windows计算机,它将保存界面,还有一个Raspberry Pi,它将启动程序。

我将通过SSH使用它们,但随后与之交互:

  • 从某些文本字段中,我获取程序的参数,并启动它,连接到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()

有人有想法吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

Per @aeldred:我成功了!如果有人搜索同样的问题,那就是程序执行的调用失败了,不得不用ChannelExec替换我的频道,我的exec方法变成:

 public void exec(String prog) {
        try {
            channelExec.setCommand(prog);
            channelExec.connect();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }