提问人:user2315104 提问时间:3/22/2016 最后编辑:Bill the Lizarduser2315104 更新时间:5/4/2022 访问量:2164
执行命令后,Jsch java ssh 客户端未断开连接
Jsch java ssh client is not getting disconnected after command gets executed
问:
我正在使用java ssh客户端(http://www.jcraft.com/jsch/)连接到远程计算机并执行命令。 在我连接到远程机器并执行命令之前,代码工作正常。但是,问题是,即使在命令成功执行后,通道和会话也不会断开连接。
我也调用了session.disconnect和channel.disconnect,但仍然存在问题。
这是我的代码:
JSch jsch = new JSch();
String host = null;
host = "192.168.102.211";
String privateKey = "C:\\test\\key";
String cmd = "a";
String command = "b";
jsch.addIdentity(privateKey);
Session session = jsch.getSession("user1", host, 22);
Channel channel = session.openChannel("shell");
UserInfo ui = new MyUserInfo() {
public boolean promptYesNo(String message) {
return true;
}
};
session.setUserInfo(ui);
session.connect(30000);
OutputStream ops = channel.getOutputStream();
PrintStream ps = new PrintStream(ops, true);
channel.connect();
ps.println(cmd);
ps.println(command);
ps.close();
InputStream in = channel.getInputStream();
byte[] bt = new byte[1024];
while (in.available() > 0) {
// int i = in.read(bt, 0, 1024);
for (int i = in.read(); i >=0; i--)
{
String str = new String(bt, 0, i);
System.out.print(str);
}
break;
}
if (channel != null) {
channel.disconnect();
session.disconnect();
System.out.println(channel.isConnected());
}
}
请建议
答:
2赞
Lucas Sa
3/22/2016
#1
使用相关代码更新您的问题。 只是一个提示,你应该做类似的事情。
} finally {
if (channel != null) {
Session session = channel.getSession();
channel.disconnect();
session.disconnect();
System.out.println(channel.isConnected());
}
}
评论
1赞
user2315104
3/23/2016
添加finally块后,仍然无法正常工作。我不知道为什么 while 循环没有被终止......
0赞
user565
2/21/2021
我遇到了同样的问题,即使发生了会话断开连接,程序也会继续运行。有什么想法吗?
0赞
Stone
5/4/2022
检查 channel.isClosed() 状态。如果通道关闭,则可以断开通道。我在答案中添加了示例代码,因此请检查。
0赞
Vladi
9/23/2021
#2
我有类似的错误,我将我的代码更改为第一个我有声明会话和通道的
代码
static Session session = null;
static Channel channel = null;
这是连接代码
public static OutputStream puttyConnection(String user, String hostName, String password)
throws JSchException, IOException {
session = new JSch().getSession(user, hostName, 22);
session.setPassword(password);
java.util.Properties config = new java.util.Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
session.connect();
channel = session.openChannel("shell");
OutputStream ops = channel.getOutputStream();
channel.connect();
return ops;
}
在我运行代码的最后,我曾经像这样断开连接
if (channel != null) {
channel.disconnect();
session.disconnect();
System.out.println(channel.isConnected());
}
0赞
Stone
5/4/2022
#3
我遇到了类似的问题,意识到只有在关闭通道时才能断开通道。因此,我使用 while 循环来检查通道是否关闭,然后我能够毫无问题地断开通道。
while (true){
if(channel.isClosed()){
channel.disconnect();
break;
}
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
评论