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

9

我使用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.JSchException:会话中断
at com.jcraft.jsch.Session.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
3个回答

3
请移除此内容:
Thread.sleep(1000);

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

1
感谢你提供详细的答案!你帮了我很多。 - xmlParser
1
沿着这个SO互动的历史(4年后),只能摇头。这应该是答案。 - jomofrodo

3

尝试使用:

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

并且设置

sshSession.connect(connectionTimeout) to 5000 or more.

也就像Martin所说的那样。
remove Thread.sleep(1000);

5
认证成功,因此设置 PreferredAuthentications 无法帮助。请勿建议任何人在不解释后果的情况下使用 StrictHostKeyChecking=no - Martin Prikryl
感谢您提供详细的答案! - xmlParser
谢谢,运行得非常好。 - Baha' Al-Khateib

0

我因为不同的原因遇到了完全相同的错误。

基本上,我没有正确地断开连接,打开了太多的会话。

所以当我尝试连接时,它给我返回了你正在获取的完整堆栈跟踪。

简单地终止所有连接(pkill)并进行适当的断开连接就解决了我的问题。


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