expect4j没有等待全部输出

时间:2014-08-07 23:30:14

标签: java ssh expect blocking jsch

我使用expect4j和JSch连接到远程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等待命令完成?

此外,每个命令都会从expect命令(0,1,2,2)返回不同的返回码。有没有我可以查找这些代码的地方?它们有什么意义吗?

2 个答案:

答案 0 :(得分:1)

这就是我使用它的方式。

请注意,由于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。看起来非常好的期待库。

答案 1 :(得分:-1)

使用expect4j expect4j没有等待全部输出 例如AIX的命令'prtconf'