使用java连接到SFTP

时间:2011-06-09 09:19:58

标签: java sftp

我需要帮助连接到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

这段代码有什么问题?

6 个答案:

答案 0 :(得分:2)

您可以尝试增加Jsch Framework的超时。

session.connect(int Timeout)

session.connect(30000);

更多关于Jcsh javadoc

答案 1 :(得分:1)

以下是关于Stackoverflow的早期问题,已接受的答案建议使用JSch library

How to retrieve a file from a server via SFTP?

我看到你试图通过JSch连接并收到错误。

我建议首先检查一下你是否可以从客户端(你正在测试你的程序的同一台机器)连接到sftp机器,使用像Windows上的Filezilla这样的标准sftp客户端或{{{在* nix系统中的终端上执行命令。

答案 2 :(得分:0)

我使用JSch library取得了成功。它的文档非常糟糕,但传闻它非常严格有效地实现了SSH功能。

答案 3 :(得分:0)

您可以使用Apache commons VFS

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

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

我遇到了与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);