我正在使用Jsch并希望连接到网络设备并更新配置,更改密码等...
我遇到的问题是环回连接仍处于打开状态,这会阻止创建更多ssh会话。我读到这是某些版本的OpenSSH的问题,解决方案是升级sshd。不幸的是,连接到网络设备时,这有时不是一种选择。
没有解决方法吗?
编辑 - 这是我的代码 - 我不是手动关闭所有内容吗?
JSch jSch = new JSch();
Session session = jSch.getSession("username", h.hostname);
Properties config = new Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
session.setPassword("password");
session.connect();
Channel channel = session.openChannel("shell");
Expect expect = new ExpectBuilder()
.withOutput(channel.getOutputStream())
.withInputs(channel.getInputStream(), channel.getExtInputStream())
.withEchoOutput(System.out)
.withEchoInput(System.err)
.withExceptionOnFailure()
.build();
channel.connect();
expect.expect(contains("#"));
expect.sendLine("showRules\r");
String response = expect.expect(regexp("#")).getBefore();
System.out.println("---" + response + "----");
expect.sendLine("exit\r");
expect.close();
channel.disconnect();
session.disconnect();
答案 0 :(得分:2)
以下是我对here.
提出的同一问题的回复当没有输入时,通道不会自行关闭。阅读完所有数据后,请尝试自行关闭它。
while (true) {
while (inputStream.available() > 0) {
int i = inputStream.read(buffer, 0, 1024);
if (i < 0) {
break;
}
//It is printing the response to console
System.out.print(new String(buffer, 0, i));
}
System.out.println("done");
channel.close(); // this closes the jsch channel
if (channel.isClosed()) {
System.out.println("exit-status: " + channel.getExitStatus());
break;
}
try{Thread.sleep(1000);}catch(Exception ee){}
}
当您使用来自用户的交互式键盘输入时,您唯一一次使用不会手动关闭通道的循环。然后,当用户执行“退出”时,将更改频道的'getExitStatus'。如果你的循环是while(channel.getExitStatus()== -1),那么当用户退出时循环将退出。检测到退出状态后,您仍需要自行断开频道和会话。
它没有在他们的示例页面上列出,但JSCH在其站点上托管了一个交互式键盘演示。 http://www.jcraft.com/jsch/examples/UserAuthKI.java
甚至他们的演示,我曾经连接到AIX系统而不改变他们的任何代码......当你退出shell时它不会关闭!
在我的远程会话中键入“exit”后,我必须添加以下代码才能使其正常退出:
channel.connect();
// My added code begins here
while (channel.getExitStatus() == -1){
try{Thread.sleep(1000);}catch(Exception e){System.out.println(e);}
}
channel.disconnect();
session.disconnect();
// My Added code ends here
}
catch(Exception e){
System.out.println(e);
}
}
答案 1 :(得分:2)
事实证明,我的IDE - IntelliJ IDEA正在创建未关闭的环回连接。当我将类部署到UNIX机器并运行它时,没有延迟的环回连接,也没有用完它们的问题。