Jsch Java SSH客户端在执行命令后无法断开连接。

4
我正在使用 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());
    }
}

请提出建议。
3个回答

2

请在您的问题中附上相关代码。 提示一下,您应该做类似于以下的操作。

} finally {
    if (channel != null) {
        Session session = channel.getSession();
        channel.disconnect();
        session.disconnect();
        System.out.println(channel.isConnected());
    }
}

1
添加了 finally 块之后,它仍然无法正常工作。我不知道为什么 while 循环没有终止... - user2315104
我遇到了同样的问题,即使会话断开连接,程序仍然在运行。有任何想法吗? - user565
请检查channel.isClosed()的状态。 如果通道已关闭,则可以断开通道。我在我的答案中添加了示例代码,请检查。 - Stone

0
我遇到了类似的问题,意识到只有在通道关闭时才能断开连接。因此,我使用 while 循环来检查通道是否关闭,然后就能够顺利地断开通道了。
       while (true){
            if(channel.isClosed()){
                channel.disconnect();
                break;
            }
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }

0

我有类似的错误,我把我的代码改成了这样
首先我声明了sessionchannel

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());
        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接