我使用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)返回不同的返回码。有没有我可以查找这些代码的地方?它们有什么意义吗?
答案 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'