【问题标题】:connect to SFTP using java使用 java 连接到 SFTP
【发布时间】:2011-06-09 09:19:58
【问题描述】:

我需要有关连接 SFTP 服务器的帮助吗?有人有工作代码吗?

我发现了类似的东西

package test.JSch;

import com.jcraft.jsch.*;

public class TestJSch {
public static void main(String args[]) {
    JSch jsch = new JSch();
    Session session = null;
    try {
        session = jsch.getSession("USSERNAME", "HOST", 22);
        //session.setConfig("StrictHostKeyChecking", "no");
        session.setPassword("PASSWORD");
        System.out.println("1");
        session.connect();
        System.out.println("2");

        Channel channel = session.openChannel("sftp");
        System.out.println("3");
        channel.connect();
        System.out.println("4");
        ChannelSftp sftpChannel = (ChannelSftp) channel;
        sftpChannel.get("remotefile.txt", "localfile.txt");
        sftpChannel.exit();
        session.disconnect();
    } catch (JSchException e) {
        e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
    } catch (SftpException e) {
        e.printStackTrace();
    }
    }
}

但这是输出

com.jcraft.jsch.JSchException: java.net.ConnectException: Connection timed out: connect
    at com.jcraft.jsch.Util.createSocket(Util.java:258)
    at com.jcraft.jsch.Session.connect(Session.java:186)
    at com.jcraft.jsch.Session.connect(Session.java:145)
    at test.JSch.TestJSch.main(TestJSch.java:17)
Caused by: java.net.ConnectException: Connection timed out: connect
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.PlainSocketImpl.doConnect(Unknown Source)
    at java.net.PlainSocketImpl.connectToAddress(Unknown Source)
    at java.net.PlainSocketImpl.connect(Unknown Source)
    at java.net.SocksSocketImpl.connect(Unknown Source)
    at java.net.Socket.connect(Unknown Source)
    at java.net.Socket.connect(Unknown Source)
    at java.net.Socket.<init>(Unknown Source)
    at java.net.Socket.<init>(Unknown Source)
    at com.jcraft.jsch.Util.createSocket(Util.java:252)
    ... 3 more

这段代码有什么问题?

【问题讨论】:

  • 当你说它不起作用时,你能更具体一点吗?你得到什么例外?它编译吗?你用的是什么库?

标签: java sftp


【解决方案1】:

您可以尝试增加 Jsch 框架的超时时间。

session.connect(int Timeout)

session.connect(30000);

更多关于Jcsh javadoc

【讨论】:

  • 超时是毫秒还是秒?
【解决方案2】:

这是 Stackoverflow 上的一个较早的问题,已接受的答案建议使用 JSch library

How to retrieve a file from a server via SFTP?

我看到您尝试通过 JSch 连接并遇到错误。

我建议首先检查您是否可以使用标准 sftp 客户端(如 Windows 上的 Filezilla 或 @987654323)从客户端(您正在测试程序的同一台机器)连接到 sftp 机器在 *nix 系统中的终端上使用 @ 命令。

【讨论】:

    【解决方案3】:

    我已经成功使用JSch library。众所周知,它的文档很糟糕,但有传言称它非常严格且高效地实现了其 SSH 功能。

    【讨论】:

      【解决方案4】:

      您可以使用Apache commons VFS

      FileSystemManager fsManager = VFS.getManager();
      FileObject remoteFile = fsManager.resolveFile("sftp://myusername:mypassword@somehost/pub/downloads/somefile.tgz" );
      InputStream in = remoteFile.getContent().getInputStream();
      

      【讨论】:

      • VFS 不是一大堆不同类型的文件管理工具,它们都依赖于其他几个 jar 包吗?如果 OP 只需要 SFTP 部分,那么 VFS 就有点矫枉过正了。
      • 它似乎已经过时了
      • code.google.com/p/otrosvfsbrowser 正在使用 Apache Commons VFS ver.2 来浏览远程文件系统,包括 SFTP。它工作得很好。
      【解决方案5】:

      JSch API : session.connect(); 再次询问用户名和密码以连接到服务器,即使这些是作为参数传递的。

      如何使代码避免再次询问用户名和密码。

      【讨论】:

        【解决方案6】:

        我在使用 shell 连接时遇到了同样的问题。解决方案是增加超时时间,在我的情况下 5000 毫秒就足够了

        JSch jsch = new JSch();
        Session session = jsch.getSession(USERNAME, HOSTNAME, SSH_PORT);
        session.setPassword(PASSWORD);
        Hashtable<String,String> config = new Hashtable<String,String>();
        config.put("StrictHostKeyChecking", "no");
        session.setConfig(config);
        session.connect(5000);
        

        【讨论】:

          猜你喜欢
          • 2018-02-11
          • 2017-05-25
          • 1970-01-01
          • 2015-03-31
          • 2017-02-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-06-15
          相关资源
          最近更新 更多