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

使用JSch打开SSH通道时出现“会话已关闭”错误

拓拔嘉颖
2023-03-14

我用JSch制作了一个SSH客户端。客户端与我的Apache Mina SSH服务器正常工作。但当我用真正的设备测试它时,它失败了。

这是客户端的代码:

public boolean openConnection() throws ItsSshException {

   boolean connectSuccess = false;
   Properties config = new Properties();
   config.put("StrictHostKeyChecking", "no");
   jschSSH.setConfig(config);
    try {
     sshSession = jschSSH.getSession(username, hostname, port);
     sshSession.setPassword(password);
     sshSession.connect(connectionTimeout);
     LOGGER.info("Connection timeout : " + connectionTimeout);
     Thread.sleep(1000);
     sshHChannel = sshSession.openChannel("shell");
     sshHChannel.connect();
     in = sshHChannel.getInputStream();
     out = new PrintStream(sshHChannel.getOutputStream());
     clearInitialSocketState();
     connectSuccess = true;
   } catch (Exception e) {
     LOGGER.error("Error during connecting to host: " + hostname +
                  ", port: " + port + "!", e);
     throw new ItsSshException("Error during connecting to host: " + e.getMessage());
   }
   LOGGER.info("connectSuccess : " + connectSuccess);
   return connectSuccess;
}

代码此时失败:

sshHChannel = sshSession.openChannel("shell");

连接到主机时出错:127.0.0.1,端口:22
com。jcraft。jsch。JSCHEException:com上的会话已关闭
。jcraft。jsch。一场openChannel(Session.java:861)

我的问题是如何解决这个问题,什么能使它发生?

这是JSch日志:

INFO: Connecting to 127.0.0.1 port 22 
INFO: Connection established 
INFO: Remote version string: SSH-2.0-Mocana SSH
INFO: Local version string: SSH-2.0-JSCH-0.1.54
INFO: CheckCiphers: aes256-ctr,aes192-ctr,aes128-ctr,aes256-cbc,aes192-cbc,aes128-cbc,3des-ctr,arcfour,arcfour128,arcfour256
INFO: aes256-ctr is not available.
INFO: aes192-ctr is not available.
INFO: aes256-cbc is not available.
INFO: aes192-cbc is not available.
INFO: CheckKexes: diffie-hellman-group14-sha1,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521
INFO: CheckSignatures: ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521
INFO: SSH_MSG_KEXINIT sent
INFO: SSH_MSG_KEXINIT received
INFO: kex: server: diffie-hellman-group14-sha1,diffie-hellman-group1-sha1
INFO: kex: server: ssh-dss,ssh-rsa
INFO: kex: server: aes256-cbc,rijndael256-cbc,aes192-cbc,rijndael192-cbc,aes128-cbc,rijndael128-cbc,3des-cbc,arcfour
INFO: kex: server: aes256-cbc,rijndael256-cbc,aes192-cbc,rijndael192-cbc,aes128-cbc,rijndael128-cbc,3des-cbc,arcfour
INFO: kex: server: hmac-sha1,hmac-sha1-96,hmac-md5,hmac-md5-96
INFO: kex: server: hmac-sha1,hmac-sha1-96,hmac-md5,hmac-md5-96
INFO: kex: server: none
INFO: kex: server: none
INFO: kex: server: 
INFO: kex: server: 
INFO: kex: client: diffie-hellman-group1-sha1
INFO: kex: client: ssh-rsa,ssh-dss,ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521
INFO: kex: client: aes128-ctr,aes128-cbc,3des-ctr,3des-cbc,blowfish-cbc
INFO: kex: client: aes128-ctr,aes128-cbc,3des-ctr,3des-cbc,blowfish-cbc
INFO: kex: client: hmac-md5,hmac-sha1,hmac-sha2-256,hmac-sha1-96,hmac-md5-96
INFO: kex: client: hmac-md5,hmac-sha1,hmac-sha2-256,hmac-sha1-96,hmac-md5-96
INFO: kex: client: none
INFO: kex: client: none
INFO: kex: client: 
INFO: kex: client: 
INFO: kex: server->client aes128-cbc hmac-md5 none
INFO: kex: client->server aes128-cbc hmac-md5 none
INFO: SSH_MSG_KEXDH_INIT sent
INFO: expecting SSH_MSG_KEXDH_REPLY
INFO: ssh_rsa_verify: signature true
WARN: Permanently added '127.0.0.1' (RSA) to the list of known hosts.
INFO: SSH_MSG_NEWKEYS sent
INFO: SSH_MSG_NEWKEYS received
INFO: SSH_MSG_SERVICE_REQUEST sent
INFO: SSH_MSG_SERVICE_ACCEPT received
INFO: Authentications that can continue: publickey,keyboard-interactive,password
INFO: Next authentication method: publickey
INFO: Authentications that can continue: keyboard-interactive,password
INFO: Next authentication method: keyboard-interactive
INFO: Authentications that can continue: password
INFO: Next authentication method: password
INFO: Authentication succeeded (password).
INFO: Caught an exception, leaving main loop due to End of IO Stream Read
INFO: Disconnecting from 127.0.0.1 port 22

共有2个答案

叶茂
2023-03-14

删除此项:

Thread.sleep(1000);

服务器可能会超时等待来自客户端(JSch)的请求并中止连接。

刘畅
2023-03-14

尝试使用:

Properties config = new Properties();
config.put("StrictHostKeyChecking", "no");
config.put("PreferredAuthentications", "password");
jschSSH.setConfig(config);

而且还设置了

sshSession.connect(connectionTimeout) to 5000 or more.

正如马丁所说

remove Thread.sleep(1000);
 类似资料:
  • 问题内容: 我设法用Jsch通过ssh执行了一条命令,但是当我尝试执行第二条命令时却失败了 为了调试,我将此问题归结为以下几行: 这主要是官方的Exec示例,但这给了我以下输出: 第一个命令成功执行,第二个则没有成功。 有任何想法吗 ? 问题答案: 嘿,jsch和Ubuntu完全一样。(如何)解决了?为每个执行执行新会话会浪费太多时间?此刻,我捕获了jsch异常并搜索“会话未关闭”,然后我重新连接

  • 问题内容: 我的目的是连接到位于防火墙后面的服务器(主机)。我可以通过连接到网络中的另一台服务器(隧道)然后通过SSH到该服务器来访问此服务器。但是,我无法通过JSch实现相同的方案。 我无法为此编写以下代码。如果我在这里做任何愚蠢的事情,请告诉我。 上面的代码在行中给出了以下异常。 问题答案: jsch上的代理设置允许您连接到远程端上 正在运行的 代理服务器。一个在远程端将 不 被视为一个代理。

  • 问题内容: 这些方法之间有什么区别,哪种更好?到现在为止,我的代码如下: 但是在运行上述代码时,记录并不总是被删除(精确地:id = 1永远不会被删除,而其他id总是被删除)。我读到保持打开的会话可以稍微加快应用程序的速度- 这就是为什么我要共享会话对象。我的业务对象通过DI获取会话工厂: 问题答案: 根据我在Hibernate的经验,得出的结论是,最好的策略是使Hibernate会话寿命与单个事

  • 问题内容: 当我按如下方式调用session.begin事务方法时: 然后我得到以下异常消息 造成此错误的原因是什么? 问题答案: 更新: 我想调用并不能保证该会话实际上是打开的。第一次,您应该使用 代替。该建议实际上与您找到的页面一致。 之前: 根据到目前为止的可用信息,我们可以得出结论,错误的原因是会话未打开;-)

  • 我有两个运行在不同机器上的ActiveMQ Artemis代理,组成一个简单的集群。我正在使用一个Java应用程序(非常基本)来生成和使用消息,以分析集群的行为。Java代码如下所示: 同时在处使用断点调试上述应用程序。如果我停止我的主代理,那么我会看到从代理接管,所有的消息都像预期的那样被移动到从代理。但是,此时,如果我继续使用我的应用程序,它将抛出,而不是在从代理中使用消息。当我再次启动主代理

  • 基本上,我有一个java程序,它使用JSch SSH库来控制两个不同的SSH连接。 我创建了一个名为SSHConnection的类,它是JSch库的包装器,并通过调用如下所示的构造函数初始化了两个副本: 但是,我发现,如果我已经打开了一个使用SHELL通道的会话,当我试图为第二个会话打开第一个通道时,我会得到一个错误,即“channel is not opened”(JSch异常)。 有没有一种方