我在JSch中使用Expect4j连接到远程Shell并提取配置文件。我用来连接机器的代码如下:

    Session session = jsch.getSession(
            host.getUser(),
            host.toString(),
            SSH_PORT);
    session.setPassword(host.getPass());
    //If this line isn't present, every host must be in known_hosts
    session.setConfig("StrictHostKeyChecking", "no");
    session.connect();
    Channel channel = session.openChannel("shell");
    channel.connect();
    InputStream in = channel.getInputStream();
    OutputStream out = channel.getOutputStream();
    Expect4j expect = new Expect4j(in, out);
    for(String command : commands) { //List of commands
        int returnVal = expect.expect(prompts); //List of Match[] objects that correspond to different possible prompts
        if (returnVal != COMMAND_SUCCESS_OPCODE) {
            System.err.println("ERROR: tried to run " + command + " and got opcode " + returnVal);
        }
        expect.send(command);
        expect.send(ENTER_BUTTON); //Constant that corresponds to newline
    }


运行时,代码会给我以下消息:

<Current Date & Time> expect4j.BlockingConsumer run
INFO: Stop Requested
<Current Date & Time> expect4j.BlockingConsumer run
INFO: Found EOF to stop while loop


我认为问题出在最后一个命令要花一两秒钟的事实。有没有办法让Expect4j等待命令完成?

此外,每个命令都返回与期望命令(0,1,2,2)不同的返回码。有什么地方可以查询这些代码吗?它们有什么意义?

最佳答案

这就是我的用法。

注意,从jsch-0.1.50开始,我不得不开始使用它来使其工作

    Hashtable<String,String> config = new Hashtable<String,String>();
    config.put("StrictHostKeyChecking", "no");
    config.put("PreferredAuthentications",
               "publickey,keyboard-interactive,password");//makes kerberos happy
    session.setConfig(config);


所以基本上我使用的是tutorial提供的完全相同的代码,除了我的库是最新的

expect4j-1.0.jar
jakarta-oro-2.0.8.jar
jsch-0.1.51.jar


而且由于我的用户不是root用户,

private static String[] linuxPromptRegEx = new String[]{"\\$"};


祝好运

ps。我会尝试this alternative。看起来很好的期望库。

07-24 09:45