当前位置: 首页 > 知识库问答 >
问题:

jsch java ssh客户端在命令执行后不会断开连接

杨宏儒
2023-03-14

我使用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个答案

梁锋
2023-03-14

我有类似的错误,我将代码更改为
首先声明会话和通道

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());
        }
经佐
2023-03-14

用相关代码更新您的问题。只是一个提示,你应该这样做。

} finally {
    if (channel != null) {
        Session session = channel.getSession();
        channel.disconnect();
        session.disconnect();
        System.out.println(channel.isConnected());
    }
}
 类似资料:
  • 此页面描述了 "storm" 命令行客户端可能使用的所有命令. 要了解如何设置 "storm" 客户端与远程群集的操作, 请按照 安装开发环境 中的说明进行操作. 这些命令是: jar sql kill activate deactivate rebalance repl classpath localconfvalue remoteconfvalue nimbus supervisor ui d

  • 问题内容: 我使用和创建一个实时Web应用程序。我将为用户提供对套接字连接的完全控制,例如手动断开连接和(重新)连接。 在客户端启动时,该功能可以正常运行,但是在使用之后,不会启动新连接。 问题答案: 现在可以使用socket.socket.reconnect() 相关:https : //github.com/LearnBoost/socket.io- client/issues/251

  • 我制作了一个简单的spring boot应用程序。我有一个RESTendpoint,它返回当前时间的热流。 当我调用时,我得到的数据流看起来像: 数据:2018-04-03T13:20:38.31322100Z 数据:2018-04-03T13:20:39.31149350Z Data: 2018-04-03T13:20:40.310878800Z ...... 当我断开与流的连接(关闭浏览器选项

  • Subversion 命令行客户端:svn 为了使用命令行客户端,只需要输入svn和它的子命令[54]以及相关的选项或操作的对象—输入的子命令和选项没有特定的顺序,下面使用svn status的方式都是合法的: $ svn -v status $ svn status -v $ svn status -v myfile 你可以在第 2 章 基本使用发现更多使用客户端命令的例子,以及“属性”一

  • null 当MQTT代理变得不可用时,Paho MQTT客户机不能帮助我保证这些QoS2级别的消息将被重新传递,这是正确的说法吗? 因此,我如何区分以下情况,即Client.Publish导致了一个MqttException,其中Paho没有将消息持久化。 下面是它在飞行中坚持的地方 null 连接丢失(32109):PAHO保存消息 客户端当前正在断开连接(32102):PAHO丢失消息 等待服

  • 我正在使用C#window应用程序表单对TCP多线程服务器进行工作,我正在尝试检测客户端的机器是否关闭并断开与服务器的连接。看了一些帖子,有了一些想法: 如何确定tcp是否连接? 我的代码如下: 多谢帮忙。