我在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。看起来很好的期望库。