0

我正在使用单线程应用程序来连接我的客户端服务器架构。基本上,此应用程序将创建许多连接并在作业完成后自动关闭它。我们遇到了一个例外

'com.sshtools.j2ssh.transport.TransportProtocolException:连接未完成'

我们启用了 j2ssh 日志来找出问题的根本原因。以下是有关该问题的完整详细信息。

Java版本:jdk1.6.0_11

使用的 API:J2SSH 核心 0.2.9 (j2ssh-core-0.2.9.jar)

com.sshtools.j2ssh.transport.TransportProtocolException: The connection did not complete
    at com.sshtools.j2ssh.transport.TransportProtocolClient.onStartTransportProtocol(Unknown Source)
    at com.sshtools.j2ssh.transport.TransportProtocolCommon.startTransportProtocol(Unknown Source)
    at com.sshtools.j2ssh.SshClient.connect(Unknown Source)
    at com.sshtools.j2ssh.SshClient.connect(Unknown Source)
    at com.sshtools.j2ssh.SshClient.connect(Unknown Source)
    at info.itserv.globalinterface.gui.SFTP.openSSH(SFTP.java:95)
    at info.itserv.globalinterface.gui.SFTP.connectionSFTP(SFTP.java:228)

........以及以下代码

public void openSSH(String hostname, int authCode) {
        try {

            sshClient.connect(hostname,
                              new IgnoreHostKeyVerification());
            sshClient.getConnectionProperties().setPort(this.port);
            //Authenticate
            GENERAL.println("Processing logging...");
            switch (authCode) {
            case 0:
                this.login(this.username, this.password);
                System.out.println("Password authentication");
                break;
            case 1:

                //String keyFilename = "D:\\Cygwin\\home\\gtantot\\id_dsa";
                this.loginCertificat(this.username, this.keyFilename,
                                     this.passphrase);
                System.out.println("Password authentication");
                break;
            default:
                System.out.println("ECHEC SSH connection");
                break;
            }
            this.sftp = sshClient.openSftpClient();

        } catch (TransportProtocolException e) {
            System.out.println("Transport: "+e.getMessage().toString() );

            e.printStackTrace();

        }
        catch (IOException e1) {
            System.out.println("Error openSSH: "+e1.getMessage());
            e1.printStackTrace();

        }    }

    public void closeSSH() {
        if (sshClient != null) {
            sshClient.disconnect();
        }
    }

有没有办法克服这个错误?由于这种错误会导致应用程序的一个 sftp 会话失败,有什么解决办法呢?

4

1 回答 1

3

如果您发布了完整的日志,应该会有更多的输出,您是否将日志记录调高到 DEBUG 级别?

查看代码,当密钥交换期间出现问题时会发生此异常,可能您连接的服务器不支持旧 J2SSH API 支持的任何密钥交换算法。

您使用的 J2SSH 版本可能已于 2009 年发布,但自 2007 年原作者停止贡献以来,很少或根本没有在 API 中投入任何工作。许多服务器现在禁用较旧的、不太安全的密钥交换,并且很可能是类似这样的东西导致了问题。

如果您想继续使用 J2SSH 之类的 API 而不是 JSch,您可以使用 J2SSH Maverick 的开源版本,它与 J2SSH 的作者相同(顺便说一句,我就是这样)。

https://github.com/sshtools/j2ssh-maverick

于 2015-03-25T09:08:58.683 回答