【问题标题】:JSCH: SFTP. Hangs at session.connect() using the port 21JSCH:SFTP。使用端口 21 在 session.connect() 处挂起
【发布时间】:2013-12-31 19:19:53
【问题描述】:

我正在通过 sftp(JSCH) 连接到 FTP 服务器。

每次我使用端口 21 连接到 FTP 服务器时,它总是在 session.connect() 处挂起。

它不会抛出任何异常。但是当我使用其他端口时。它可以工作并引发异常。

有什么办法可以捕捉到错误吗?

这是我的代码示例。

public static void main(String[] args) throws SftpException {

    JSch jsch = new JSch();

    try {

        Session session = jsch.getSession("username", "host", 21);
        session.setConfig("StrictHostKeyChecking", "no");
        session.setPassword("password");
        session.connect();

        Channel channel = session.openChannel("sftp");
        channel.connect();
        ChannelSftp channelSftp = (ChannelSftp) channel;
        session.disconnect();
        channelSftp.disconnect();

    } catch (JSchException e) {
        log("Cannot make connection to FTP server ");
        e.printStackTrace();

    }

}

【问题讨论】:

  • 没有“其他端口”。端口 22 是 SSH 端口。 21 端口当然不是。
  • 我知道没有其他端口。我的问题是我期待它抛出异常。但它只是挂在 session.connect()
  • 我也面临同样的问题

标签: java sftp jsch


【解决方案1】:

我遇到了类似的问题,但使用了正确的端口。 session.connect() 只是挂起并且不返回任何内容。而其他程序可以成功连接。

原因是宿主提供了更多的认证方式,我们必须让Jsch只使用密码。

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

【讨论】:

  • 我的问题是 session.connection() 每次连接到 SFTP 最多需要 40 秒,设置这些属性后它会在 1-2 秒内连接。
【解决方案2】:

会不会是 22 端口是 SFTP 的默认端口?在端口 21 上运行的 FTP 服务器不知道如何协商安全 FTP 的对话。基本上,SFTP 是基于 SSH 的 FTP。

编辑: 问题是,它无限期地等待谈判完成。这是一场双方都没有放弃的墨西哥对峙。在session.connect() 之前调用session.setTimeout(),或调用session.connect(timeout),使用一些合适的值(3-5 秒)。我相信超时以毫秒为单位。

【讨论】:

  • 只是我的问题是当用户输入除 22 以外的端口时。我希望 JSCH 会抛出异常。我的问题是它不会引发任何错误。我只是挂断了 session.connect()。当我使用 22 端口时,我可以成功连接到 ftp 服务器。
  • 我的问题是我客户的“sftp”服务器实际上是 ftp,他确定是 sftp 但不是,你的帖子让我看到了这种可能性。
【解决方案3】:

我们正在从webMethods 服务器运行JSch。 升级到新版本后,当我们尝试连接到我们的一个合作伙伴时,它会挂在连接步骤上。

这里建议的解决方案没有奏效。我收到了这个错误:

com.jcraft.jsch.JSchException:身份验证失败

我注意到我们尝试连接的服务器在连接完成之前要求输入用户名和密码:

[sagtest@indigo sftpTest]$ /opt/sag/95/sitcore/jvm/jvm/bin/java -jar     
SftpConnect.jar
Password has been set
Timeout has been set
Kerberos username [sagtest]:
Kerberos password for sagtest:
Connected
Channel opened
Connected
Session: iui-bpjobs01.itservices.lan:22:bp-xfer-int:1738666864

Kerberos 用户和密码根本不应该存在。

经过小小的调查,我发现了这个页面: Skipping Kerberos authentication prompts with JSch

PreferredAuthentications 设置为其他值后 - 一切正常。我添加的代码:

session.setConfig("PreferredAuthentications", "publickey,keyboard-interactive,password");

这是我的完整示例 - 也许它会帮助某人调试您的问题:

public static void main (String[] args){
    String serverport = "22";
    String serverhost = "XXXX";
    String username = "YYYY";
    String password = "ZZZZZ";
    int timeout = 5000;
    try{
      int port = 22;
        String sessionkey = null; 
        if(serverport != null && !serverport.trim().equals(""))
            port = Integer.parseInt(serverport);
        JSch jsch=new JSch();

        Session session=jsch.getSession(username, serverhost, port);
        jsch.setKnownHosts(System.getProperty("user.home")+"/.ssh/known_hosts");

        session.setPassword(password);
        System.out.println("Password has been set");
        if(timeout > 0){
            session.setTimeout(timeout);
            System.out.println("Timeout has been set");
        }
        session.setConfig("PreferredAuthentications", "publickey,keyboard-interactive,password");
        System.out.println("Added PreferredAuthentications");
        session.connect();
        System.out.println("Connected");

        Channel channel = session.openChannel("sftp");
        System.out.println("Channel opened");
        channel.connect();
        System.out.println("Connected");
        if (channel.isConnected()){
            sessionkey = serverhost  + ":" + serverport + ":" + username + ":" + Thread.currentThread().hashCode();
        } 
        System.out.println("Session: "+sessionkey);
    }catch(Exception e){
        e.printStackTrace();
    }
}

【讨论】:

    【解决方案4】:

    在我的情况下,仅将 JSch 更新到最新版本(当前为 1.50)解决了该问题,似乎与旧版本的 JSch 和最新的 OpenSSH 版本 7.1.x 的密钥/身份验证握手不兼容

    【讨论】:

      猜你喜欢
      • 2011-09-24
      • 2019-03-26
      • 1970-01-01
      • 2015-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-13
      • 1970-01-01
      相关资源
      最近更新 更多